|
1 | | -use crate::{Rknpu, RknpuError, SubmitBase, SubmitRef}; |
| 1 | +use crate::{JobMode, Rknpu, RknpuError, RknpuTask, SubmitBase, SubmitRef}; |
2 | 2 |
|
3 | 3 | /// 子核心任务索引结构体 |
4 | 4 | /// |
@@ -95,49 +95,45 @@ pub struct RknpuMemSync { |
95 | 95 | } |
96 | 96 |
|
97 | 97 | 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 | + }; |
101 | 105 | 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; |
104 | 106 |
|
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 | + }; |
109 | 113 |
|
110 | 114 | let job = SubmitRef { |
111 | 115 | 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, |
118 | 122 | }, |
119 | | - task_number, |
120 | | - regcmd_base_addr: todo!(), |
| 123 | + task_number: submit_tasks.len(), |
| 124 | + regcmd_base_addr: submit_tasks[0].regcmd_addr as _, |
121 | 125 | }; |
122 | 126 | 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 |
128 | 129 | loop { |
129 | 130 | let status = self.base[0].handle_interrupt(); |
130 | | - if status == int_mask { |
| 131 | + if status == job.base.int_mask { |
131 | 132 | break; |
132 | 133 | } |
133 | 134 | } |
134 | 135 |
|
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()..]; |
141 | 137 | } |
142 | 138 |
|
143 | 139 | Ok(()) |
|
0 commit comments