|  | /* | 
|  | * Copyright (c) 2020 Intel Corporation | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  | #ifndef __MSGDEV_H__ | 
|  | #define __MSGDEV_H__ | 
|  |  | 
|  | /* Define this to enable logging of every event as it is processed to | 
|  | * carefully inspect behavior.  Note that at high event rates (see | 
|  | * MAX_EVENT_DELAY_TICKS) the log backend won't be able to keep up and | 
|  | * that the log processing will add CPU load that is not accounted for | 
|  | * in AVERAGE_LOAD_TARGET_PCT.  Disable for more accurate statistics | 
|  | * measurement.  Note that if you don't want the log subsystem | 
|  | * throttling to drop messages, you'll probably want to increase | 
|  | * MAX_EVENT_DELAY_TICKS too, to slow down the reporting. | 
|  | */ | 
|  | #define LOG_EVERY_EVENT 1 | 
|  |  | 
|  | /* Number of worker threads, each at a separate priority, split evenly | 
|  | * between cooperative and preemptible priorities. | 
|  | */ | 
|  | #define NUM_THREADS 4 | 
|  |  | 
|  | /* The proc_cyc duty cycle parameters are chosen to use approximately | 
|  | * this fraction of one CPU's available cycles.  Default 60% | 
|  | */ | 
|  | #define AVERAGE_LOAD_TARGET_PCT 60 | 
|  |  | 
|  | /* "Hardware interrupts" for our fake device will arrive after a | 
|  | * random delay of between zero and this number of ticks.  The event | 
|  | * rate should be high enough to collect enough data but low enough | 
|  | * that it is not regular. | 
|  | */ | 
|  | #define MAX_EVENT_DELAY_TICKS 8 | 
|  |  | 
|  | /* How many events will be sent before the test completes?  Note that | 
|  | * we keep a naive array of latencies to compute variance, so this | 
|  | * value has memory costs. | 
|  | */ | 
|  | #define MAX_EVENTS 40 | 
|  |  | 
|  | /* The "messages" dispatched by our MetaIRQ thread */ | 
|  | struct msg { | 
|  | /* Sequence number */ | 
|  | uint32_t seq; | 
|  |  | 
|  | /* Cycle time when the message was "received" */ | 
|  | uint32_t timestamp; | 
|  |  | 
|  | /* Thread to which the message is targeted */ | 
|  | uint32_t target; | 
|  |  | 
|  | /* Cycles of processing the message requires */ | 
|  | uint32_t proc_cyc; | 
|  |  | 
|  | /* Cycles of latency before the MetaIRQ thread received the message */ | 
|  | uint32_t metairq_latency; | 
|  | }; | 
|  |  | 
|  | /* Initialize the fake "message" device, after this messages will | 
|  | * begin arriving via message_dev_fetch(). | 
|  | */ | 
|  | void message_dev_init(void); | 
|  |  | 
|  | /* Retrieve the next message from the "device", blocks until | 
|  | * delivery | 
|  | */ | 
|  | void message_dev_fetch(struct msg *m); | 
|  |  | 
|  | #endif /* __MSGDEV_H__ */ |