DMASequencer.cc (7055:4e24742201d7) | DMASequencer.cc (7453:1a5db3dd0f62) |
---|---|
1/* 2 * Copyright (c) 2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 68 unchanged lines hidden (view full) --- 77 active_request.start_paddr = paddr; 78 active_request.write = write; 79 active_request.data = data; 80 active_request.len = len; 81 active_request.bytes_completed = 0; 82 active_request.bytes_issued = 0; 83 active_request.pkt = request.pkt; 84 | 1/* 2 * Copyright (c) 2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 68 unchanged lines hidden (view full) --- 77 active_request.start_paddr = paddr; 78 active_request.write = write; 79 active_request.data = data; 80 active_request.len = len; 81 active_request.bytes_completed = 0; 82 active_request.bytes_issued = 0; 83 active_request.pkt = request.pkt; 84 |
85 SequencerMsg msg; 86 msg.getPhysicalAddress() = Address(paddr); 87 msg.getLineAddress() = line_address(msg.getPhysicalAddress()); 88 msg.getType() = write ? SequencerRequestType_ST : SequencerRequestType_LD; | 85 SequencerMsg *msg = new SequencerMsg; 86 msg->getPhysicalAddress() = Address(paddr); 87 msg->getLineAddress() = line_address(msg->getPhysicalAddress()); 88 msg->getType() = write ? SequencerRequestType_ST : SequencerRequestType_LD; |
89 int offset = paddr & m_data_block_mask; 90 | 89 int offset = paddr & m_data_block_mask; 90 |
91 msg.getLen() = (offset + len) <= RubySystem::getBlockSizeBytes() ? | 91 msg->getLen() = (offset + len) <= RubySystem::getBlockSizeBytes() ? |
92 len : RubySystem::getBlockSizeBytes() - offset; 93 94 if (write) { | 92 len : RubySystem::getBlockSizeBytes() - offset; 93 94 if (write) { |
95 msg.getDataBlk().setData(data, offset, msg.getLen()); | 95 msg->getDataBlk().setData(data, offset, msg->getLen()); |
96 } 97 98 assert(m_mandatory_q_ptr != NULL); 99 m_mandatory_q_ptr->enqueue(msg); | 96 } 97 98 assert(m_mandatory_q_ptr != NULL); 99 m_mandatory_q_ptr->enqueue(msg); |
100 active_request.bytes_issued += msg.getLen(); | 100 active_request.bytes_issued += msg->getLen(); |
101 102 return RequestStatus_Issued; 103} 104 105void 106DMASequencer::issueNext() 107{ 108 assert(m_is_busy == true); 109 active_request.bytes_completed = active_request.bytes_issued; 110 if (active_request.len == active_request.bytes_completed) { 111 ruby_hit_callback(active_request.pkt); 112 m_is_busy = false; 113 return; 114 } 115 | 101 102 return RequestStatus_Issued; 103} 104 105void 106DMASequencer::issueNext() 107{ 108 assert(m_is_busy == true); 109 active_request.bytes_completed = active_request.bytes_issued; 110 if (active_request.len == active_request.bytes_completed) { 111 ruby_hit_callback(active_request.pkt); 112 m_is_busy = false; 113 return; 114 } 115 |
116 SequencerMsg msg; 117 msg.getPhysicalAddress() = Address(active_request.start_paddr + | 116 SequencerMsg *msg = new SequencerMsg; 117 msg->getPhysicalAddress() = Address(active_request.start_paddr + |
118 active_request.bytes_completed); 119 | 118 active_request.bytes_completed); 119 |
120 assert((msg.getPhysicalAddress().getAddress() & m_data_block_mask) == 0); 121 msg.getLineAddress() = line_address(msg.getPhysicalAddress()); | 120 assert((msg->getPhysicalAddress().getAddress() & m_data_block_mask) == 0); 121 msg->getLineAddress() = line_address(msg->getPhysicalAddress()); |
122 | 122 |
123 msg.getType() = (active_request.write ? SequencerRequestType_ST : | 123 msg->getType() = (active_request.write ? SequencerRequestType_ST : |
124 SequencerRequestType_LD); 125 | 124 SequencerRequestType_LD); 125 |
126 msg.getLen() = | 126 msg->getLen() = |
127 (active_request.len - 128 active_request.bytes_completed < RubySystem::getBlockSizeBytes() ? 129 active_request.len - active_request.bytes_completed : 130 RubySystem::getBlockSizeBytes()); 131 132 if (active_request.write) { | 127 (active_request.len - 128 active_request.bytes_completed < RubySystem::getBlockSizeBytes() ? 129 active_request.len - active_request.bytes_completed : 130 RubySystem::getBlockSizeBytes()); 131 132 if (active_request.write) { |
133 msg.getDataBlk(). | 133 msg->getDataBlk(). |
134 setData(&active_request.data[active_request.bytes_completed], | 134 setData(&active_request.data[active_request.bytes_completed], |
135 0, msg.getLen()); 136 msg.getType() = SequencerRequestType_ST; | 135 0, msg->getLen()); 136 msg->getType() = SequencerRequestType_ST; |
137 } else { | 137 } else { |
138 msg.getType() = SequencerRequestType_LD; | 138 msg->getType() = SequencerRequestType_LD; |
139 } 140 141 assert(m_mandatory_q_ptr != NULL); 142 m_mandatory_q_ptr->enqueue(msg); | 139 } 140 141 assert(m_mandatory_q_ptr != NULL); 142 m_mandatory_q_ptr->enqueue(msg); |
143 active_request.bytes_issued += msg.getLen(); | 143 active_request.bytes_issued += msg->getLen(); |
144} 145 146void 147DMASequencer::dataCallback(const DataBlock & dblk) 148{ 149 assert(m_is_busy == true); 150 int len = active_request.bytes_issued - active_request.bytes_completed; 151 int offset = 0; --- 24 unchanged lines hidden --- | 144} 145 146void 147DMASequencer::dataCallback(const DataBlock & dblk) 148{ 149 assert(m_is_busy == true); 150 int len = active_request.bytes_issued - active_request.bytes_completed; 151 int offset = 0; --- 24 unchanged lines hidden --- |