File: cache_flush_xehp_and_later.inl

package info (click to toggle)
intel-compute-runtime 22.43.24595.41-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 57,740 kB
  • sloc: cpp: 631,142; lisp: 3,515; sh: 470; makefile: 76; python: 21
file content (66 lines) | stat: -rw-r--r-- 2,767 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 * Copyright (C) 2021-2022 Intel Corporation
 *
 * SPDX-License-Identifier: MIT
 *
 */

#include "shared/source/command_stream/linear_stream.h"
#include "shared/source/helpers/l3_range.h"
#include "shared/source/utilities/range.h"

namespace NEO {

struct HardwareInfo;

template <typename GfxFamily>
inline size_t getSizeNeededToFlushGpuCache(const Range<L3Range> &ranges, bool usePostSync) {
    size_t size = sizeof(typename GfxFamily::L3_CONTROL) * (ranges.size() / maxFlushSubrangeCount + 1);
    size += ranges.size() * sizeof(typename GfxFamily::L3_FLUSH_ADDRESS_RANGE);
    return size;
}
template <typename GfxFamily>
inline size_t getSizeNeededForL3Control(const Range<L3Range> &ranges) {
    size_t size = sizeof(typename GfxFamily::L3_CONTROL);
    size += ranges.size() * sizeof(typename GfxFamily::L3_FLUSH_ADDRESS_RANGE);
    return size;
}

template <typename GfxFamily>
void adjustL3ControlField(void *l3ControlBuffer);

template <typename GfxFamily>
inline void flushGpuCache(LinearStream *commandStream, const Range<L3Range> &ranges, uint64_t postSyncAddress, const HardwareInfo &hwInfo) {
    using L3_FLUSH_ADDRESS_RANGE = typename GfxFamily::L3_FLUSH_ADDRESS_RANGE;
    using L3_CONTROL = typename GfxFamily::L3_CONTROL;
    using L3_FLUSH_EVICTION_POLICY = typename GfxFamily::L3_FLUSH_ADDRESS_RANGE::L3_FLUSH_EVICTION_POLICY;

    auto l3Control = reinterpret_cast<L3_CONTROL *>(commandStream->getSpace(getSizeNeededForL3Control<GfxFamily>(ranges)));
    auto cmdL3Control = GfxFamily::cmdInitL3Control;

    uint32_t basel3ControlLength = 3;
    uint32_t sizeOfl3FlushAddressRangeInDwords = 2;
    uint32_t length = basel3ControlLength + static_cast<uint32_t>(ranges.size()) * sizeOfl3FlushAddressRangeInDwords;
    cmdL3Control.setLength(length);
    cmdL3Control.setHdcPipelineFlush(true);
    if (postSyncAddress != 0) {
        cmdL3Control.setPostSyncOperation(L3_CONTROL::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA);
        cmdL3Control.getPostSyncData().setAddress(postSyncAddress);
        cmdL3Control.getPostSyncData().setImmediateData(0);
    }
    adjustL3ControlField<GfxFamily>(&cmdL3Control);
    *l3Control = cmdL3Control;

    l3Control++;
    L3_FLUSH_ADDRESS_RANGE *l3Ranges = reinterpret_cast<L3_FLUSH_ADDRESS_RANGE *>(l3Control);
    L3_FLUSH_ADDRESS_RANGE cmdFlushRange = {};
    for (const L3Range *it = &*ranges.begin(), *end = &*ranges.end(); it != end; ++it, l3Ranges++) {
        cmdFlushRange = GfxFamily::cmdInitL3FlushAddressRange;

        cmdFlushRange.setAddress(it->getMaskedAddress());
        cmdFlushRange.setAddressMask(it->getMask());
        cmdFlushRange.setL3FlushEvictionPolicy(static_cast<L3_FLUSH_EVICTION_POLICY>(it->getPolicy()));
        *l3Ranges = cmdFlushRange;
    }
}
} // namespace NEO