Skip to content

Commit 6bef42b

Browse files
committed
refactor: 重命名 submit2 方法为 submit,并优化参数处理
1 parent cdd84e2 commit 6bef42b

4 files changed

Lines changed: 36 additions & 110 deletions

File tree

src/gem.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ use crate::{
88

99
pub struct GemPool {
1010
pool: BTreeMap<u32, DVec<u8>>,
11+
handle_counter: u32,
1112
}
1213

1314
impl GemPool {
1415
pub const fn new() -> Self {
1516
GemPool {
1617
pool: BTreeMap::new(),
18+
handle_counter: 1,
1719
}
1820
}
1921

@@ -25,9 +27,14 @@ impl GemPool {
2527
Direction::Bidirectional,
2628
)
2729
.unwrap();
28-
args.handle = data.bus_addr() as _;
30+
31+
let handle = self.handle_counter;
32+
self.handle_counter = self.handle_counter.wrapping_add(1);
33+
34+
args.handle = handle;
2935
args.sram_size = data.len() as _;
3036
args.dma_addr = data.bus_addr();
37+
args.obj_addr = data.as_ptr() as _;
3138
self.pool.insert(args.handle, data);
3239
Ok(())
3340
}

src/ioctrl.rs

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{Rknpu, RknpuError, SubmitBase, SubmitRef};
1+
use crate::{JobMode, Rknpu, RknpuError, RknpuTask, SubmitBase, SubmitRef};
22

33
/// 子核心任务索引结构体
44
///
@@ -95,49 +95,45 @@ pub struct RknpuMemSync {
9595
}
9696

9797
impl Rknpu {
98-
pub fn submit_ioctrl(&self, args: &mut RknpuSubmit) -> Result<(), RknpuError> {
99-
let mut n = 0;
100-
let all = args.task_number as usize;
98+
pub fn submit_ioctrl(&mut self, args: &mut RknpuSubmit) -> Result<(), RknpuError> {
99+
let mut tasks = unsafe {
100+
core::slice::from_raw_parts(
101+
args.task_obj_addr as *const RknpuTask,
102+
args.task_number as usize,
103+
)
104+
};
101105
let max_submit_number = self.data.max_submit_number as usize;
102-
let mut task_start = args.task_start;
103-
let mut int_mask = 0;
104106

105-
while n < all {
106-
let task_number = core::cmp::min(all - n, max_submit_number);
107-
task_start = args.task_start + n as u32;
108-
let task_end = task_start + task_number as u32 - 1;
107+
while !tasks.is_empty() {
108+
let submit_tasks = if tasks.len() > max_submit_number {
109+
&tasks[..max_submit_number]
110+
} else {
111+
tasks
112+
};
109113

110114
let job = SubmitRef {
111115
base: SubmitBase {
112-
flags: todo!(),
113-
task_base_addr: todo!(),
114-
core_idx: todo!(),
115-
int_mask: todo!(),
116-
int_clear: todo!(),
117-
regcfg_amount: todo!(),
116+
flags: JobMode::from_bits_retain(args.flags),
117+
task_base_addr: args.task_base_addr as _,
118+
core_idx: args.core_mask.trailing_zeros() as usize,
119+
int_mask: submit_tasks.last().unwrap().int_mask,
120+
int_clear: submit_tasks.last().unwrap().int_clear,
121+
regcfg_amount: submit_tasks[0].regcfg_amount,
118122
},
119-
task_number,
120-
regcmd_base_addr: todo!(),
123+
task_number: submit_tasks.len(),
124+
regcmd_base_addr: submit_tasks[0].regcmd_addr as _,
121125
};
122126
self.base[0].submit_pc(&self.data, &job).unwrap();
123-
debug!(
124-
"Submitted tasks from {} to {}",
125-
task_start,
126-
task_start + task_number as u32 - 1
127-
);
127+
128+
// Wait for completion
128129
loop {
129130
let status = self.base[0].handle_interrupt();
130-
if status == int_mask {
131+
if status == job.base.int_mask {
131132
break;
132133
}
133134
}
134135

135-
debug!(
136-
"Completed tasks from {} to {}",
137-
task_start,
138-
task_start + task_number as u32 - 1
139-
);
140-
n += task_number;
136+
tasks = &tasks[submit_tasks.len()..];
141137
}
142138

143139
Ok(())

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ impl Rknpu {
331331
// }
332332

333333
pub fn submit(&mut self, job: &mut Submit) -> Result<(), RknpuError> {
334-
self.base[0].submit2(&self.data, job)
334+
self.base[0].submit(&self.data, job)
335335
}
336336

337337
pub fn handle_interrupt0(&mut self) -> u32 {

src/registers/mod.rs

Lines changed: 1 addition & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -165,90 +165,13 @@ impl RknpuCore {
165165
Ok(())
166166
}
167167

168-
pub fn submit2(&mut self, config: &RknpuData, args: &Submit) -> Result<(), RknpuError> {
168+
pub fn submit(&mut self, config: &RknpuData, args: &Submit) -> Result<(), RknpuError> {
169169
if args.tasks.len() > config.max_submit_number as usize {
170170
todo!()
171171
}
172-
173172
self.submit_pc(config, &args.as_ref())
174173
}
175174

176-
pub fn submit(
177-
&mut self,
178-
config: &RknpuData,
179-
flags: JobMode,
180-
tasks: &[RknpuTask],
181-
task_base_addr: u32,
182-
core_idx: usize,
183-
) -> Result<usize, RknpuError> {
184-
if tasks.is_empty() {
185-
return Ok(0);
186-
}
187-
188-
let pc_data_amount_scale = config.pc_data_amount_scale;
189-
190-
self.pc().base_address.set(1);
191-
192-
let task_pp_en = if flags.contains(JobMode::PINGPONG) {
193-
1
194-
} else {
195-
0
196-
};
197-
let pc_task_number_bits = config.pc_task_number_bits;
198-
199-
if config.irqs.get(core_idx).is_some() {
200-
let val = 0xe + 0x10000000 * core_idx as u32;
201-
202-
debug!("Set PC S_POINTER to {:#x}", val);
203-
204-
self.cna().s_pointer.set(val);
205-
self.core().s_pointer.set(val);
206-
}
207-
208-
let submit_tasks = if tasks.len() > config.max_submit_number as usize {
209-
&tasks[0..config.max_submit_number as usize]
210-
} else {
211-
tasks
212-
};
213-
214-
let pc_base_addr = submit_tasks[0].regcmd_addr as u32;
215-
216-
debug!("Set PC BASE_ADDRESS to {:#x}", pc_base_addr);
217-
218-
self.pc().base_address.set(pc_base_addr);
219-
220-
let amount = (submit_tasks[0].regcfg_amount + RKNPU_PC_DATA_EXTRA_AMOUNT)
221-
.div_ceil(pc_data_amount_scale)
222-
- 1;
223-
224-
debug!("Set PC REGISTER_AMOUNTS to {:#x}", amount);
225-
226-
self.pc().register_amounts.set(amount);
227-
228-
self.pc()
229-
.interrupt_mask
230-
.set(submit_tasks.last().unwrap().int_mask);
231-
self.pc()
232-
.interrupt_clear
233-
.set(submit_tasks.last().unwrap().int_clear);
234-
let task_number = submit_tasks.len() as u32;
235-
236-
let task_control = ((0x6 | task_pp_en) << pc_task_number_bits) | task_number;
237-
debug!("Set PC TASK_CONTROL to {:#x}", task_control);
238-
self.pc().task_control.set(task_control);
239-
debug!("Set PC TASK_DMA_BASE_ADDR to {:#x}", task_base_addr);
240-
self.pc().task_dma_base_addr.set(task_base_addr);
241-
242-
self.pc().operation_enable.set(1);
243-
self.pc().operation_enable.set(0);
244-
245-
for task in submit_tasks {
246-
debug!("Submitted task: {:#x?}", task);
247-
}
248-
249-
Ok(submit_tasks.len())
250-
}
251-
252175
pub fn handle_interrupt(&self) -> u32 {
253176
let int_status = self.pc().interrupt_status.get();
254177
self.pc().interrupt_clear.set(INT_CLEAR_ALL);

0 commit comments

Comments
 (0)