@@ -27,7 +27,7 @@ using namespace pldm::responder::utils;
27
27
using namespace sdbusplus ::xyz::openbmc_project::Common::Error;
28
28
namespace responder
29
29
{
30
- extern SocketWriteStatus socketWriteStatus;
30
+ // extern SocketWriteStatus socketWriteStatus;
31
31
namespace fs = std::filesystem;
32
32
33
33
namespace dma
@@ -49,7 +49,6 @@ struct AspeedXdmaOp
49
49
50
50
int DMA::transferHostDataToSocket (int fd, uint32_t length, uint64_t address)
51
51
{
52
- socketWriteStatus = NotReady;
53
52
uint32_t pageAlLength = getpageAlignedLength ();
54
53
int rc = 0 ;
55
54
int xdmaFd = -1 ;
@@ -62,6 +61,7 @@ int DMA::transferHostDataToSocket(int fd, uint32_t length, uint64_t address)
62
61
<< rc << " \n " ;
63
62
return rc;
64
63
}
64
+
65
65
void * vgaMemDump = getXDMAsharedlocation ();
66
66
if (MAP_FAILED == vgaMemDump)
67
67
{
@@ -71,41 +71,51 @@ int DMA::transferHostDataToSocket(int fd, uint32_t length, uint64_t address)
71
71
<< rc << " \n " ;
72
72
return rc;
73
73
}
74
- AspeedXdmaOp xdmaOp;
75
- xdmaOp.upstream = 0 ;
76
- xdmaOp.hostAddr = address;
77
- xdmaOp.len = length;
78
- rc = write (xdmaFd, &xdmaOp, sizeof (xdmaOp));
79
- if (rc < 0 )
80
- {
81
- rc = errno;
82
- std::cerr
83
- << " transferHostDataToSocket : Failed to execute the DMA operation, RC="
84
- << rc << " ADDRESS=" << address << " LENGTH=" << length << " \n " ;
74
+ auto mmapCleanup = [pageAlLength, &rc, xdmaFd, this ](void * vgaMem) {
85
75
if (rc != -EINTR)
86
76
{
87
- munmap (vgaMemDump, pageAlLength);
88
77
if (xdmaFd > 0 )
89
78
{
90
79
close (xdmaFd);
91
80
setXDMASourceFd (-1 );
92
81
}
82
+ munmap (vgaMem, pageAlLength);
83
+ memAddr = nullptr ;
93
84
}
94
85
else
95
86
{
96
87
std::cerr
97
88
<< " transferHostDataToSocket : Received interrupt during dump DMA transfer. Skipping Unmap"
98
89
<< std::endl;
99
90
}
91
+ };
92
+ std::unique_ptr<void , decltype (mmapCleanup)> vgaMemPtr (vgaMemDump,
93
+ mmapCleanup);
94
+
95
+ AspeedXdmaOp xdmaOp;
96
+ xdmaOp.upstream = 0 ;
97
+ xdmaOp.hostAddr = address;
98
+ xdmaOp.len = length;
99
+ rc = write (xdmaFd, &xdmaOp, sizeof (xdmaOp));
100
+ if (rc < 0 )
101
+ {
102
+ rc = -errno;
103
+ std::cerr
104
+ << " transferHostDataToSocket : Failed to execute the DMA operation, RC="
105
+ << rc << " ADDRESS=" << address << " LENGTH=" << length << " \n " ;
100
106
return rc;
101
107
}
102
108
103
109
rc = writeToUnixSocket (fd, static_cast <const char *>(vgaMemDump), length);
104
110
if (rc < 0 )
105
111
{
112
+ rc = -errno;
113
+ close (fd);
106
114
std::cerr
107
- << " transferHostDataToSocket writing To Unix Socket failed. \n " ;
108
- return -1 ;
115
+ << " transferHostDataToSocket: Closing socket as writeToUnixSocket failed with RC:"
116
+ << rc << " \n " ;
117
+
118
+ return rc;
109
119
}
110
120
rc = length;
111
121
@@ -121,7 +131,9 @@ int32_t DMA::transferDataHost(int fd, uint32_t offset, uint32_t length,
121
131
int xdmaFd = getDMAFd (true , false );
122
132
if (xdmaFd < 0 )
123
133
{
124
- std::cerr << " transferDataHost : Failed to open the XDMA device \n " ;
134
+ rc = -errno;
135
+ std::cerr << " transferDataHost : Failed to open the XDMA device rc:"
136
+ << rc << " \n " ;
125
137
return -1 ;
126
138
}
127
139
@@ -157,6 +169,7 @@ int32_t DMA::transferDataHost(int fd, uint32_t offset, uint32_t length,
157
169
rc = lseek (fd, offset, SEEK_SET);
158
170
if (rc == -1 )
159
171
{
172
+ rc = -errno;
160
173
std::cerr << " transferDataHost upstream : lseek failed, ERROR="
161
174
<< errno << " , UPSTREAM=" << upstream
162
175
<< " , OFFSET=" << offset << " \n " ;
@@ -171,6 +184,7 @@ int32_t DMA::transferDataHost(int fd, uint32_t offset, uint32_t length,
171
184
rc = read (fd, buffer.data (), length);
172
185
if (rc == -1 )
173
186
{
187
+ rc = -errno;
174
188
std::cerr << " transferDataHost upstream : file read failed, ERROR="
175
189
<< errno << " , UPSTREAM=" << upstream
176
190
<< " , LENGTH=" << length << " , OFFSET=" << offset << " \n " ;
@@ -194,27 +208,10 @@ int32_t DMA::transferDataHost(int fd, uint32_t offset, uint32_t length,
194
208
xdmaOp.hostAddr = address;
195
209
xdmaOp.len = length;
196
210
197
- // int retry = 0;
198
-
199
- // do
200
- // {
201
211
rc = write (xdmaFd, &xdmaOp, sizeof (xdmaOp));
202
- // std::cout << "KK total length of write0 from DMA:" << length
203
- // << " read out of total length rc:" << rc << " offset:" <<
204
- // offset
205
- // << " address:" << address << "\n";
206
- // if (rc > 0)
207
- // {
208
- // break;
209
- // }
210
- // retry++;
211
- // std::cout << "KK write0 retry:" << retry << " errno:" << errno <<
212
- // "\n"; usleep(1000000);
213
- // } while (retry < 3);
214
-
215
212
if (rc < 0 )
216
213
{
217
- rc = errno;
214
+ rc = - errno;
218
215
std::cerr
219
216
<< " transferDataHost : Failed to execute the DMA operation, RC="
220
217
<< rc << " UPSTREAM=" << upstream << " ADDRESS=" << address
@@ -227,6 +224,7 @@ int32_t DMA::transferDataHost(int fd, uint32_t offset, uint32_t length,
227
224
rc = lseek (fd, offset, SEEK_SET);
228
225
if (rc == -1 )
229
226
{
227
+ rc = -errno;
230
228
std::cerr << " transferDataHost downstream : lseek failed, ERROR="
231
229
<< errno << " , UPSTREAM=" << upstream
232
230
<< " , OFFSET=" << offset << " fd:" << fd << " rc:" << rc
@@ -237,6 +235,7 @@ int32_t DMA::transferDataHost(int fd, uint32_t offset, uint32_t length,
237
235
rc = write (fd, static_cast <const char *>(vgaMemPtr.get ()), length);
238
236
if (rc == -1 )
239
237
{
238
+ rc = -errno;
240
239
std::cerr
241
240
<< " transferDataHost downstream : file write failed, ERROR="
242
241
<< errno << " , UPSTREAM=" << upstream << " , LENGTH=" << length
@@ -730,11 +729,16 @@ Response rwFileByTypeIntoMemory(uint8_t cmd, const pldm_msg* request,
730
729
responseHdr.instance_id = request->hdr .instance_id ;
731
730
responseHdr.command = cmd;
732
731
responseHdr.key = responseHdr.respInterface ->getRequestHeaderIndex ();
733
- rc = cmd == PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY
734
- ? handler->writeFromMemory (offset, length, address,
735
- oemPlatformHandler, responseHdr, event)
736
- : handler->readIntoMemory (offset, length, address,
737
- oemPlatformHandler, responseHdr, event);
732
+ if (cmd == PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY)
733
+ {
734
+ handler->writeFromMemory (offset, length, address, oemPlatformHandler,
735
+ responseHdr, event);
736
+ }
737
+ else
738
+ {
739
+ handler->readIntoMemory (offset, length, address, oemPlatformHandler,
740
+ responseHdr, event);
741
+ }
738
742
739
743
return {};
740
744
}
0 commit comments