15#include "iLink_CROM.h"
16#include "iLink_internal.h"
18extern u64 ConsoleGUID;
19extern char ConsoleModelName[32];
20extern unsigned short int LocalNodeID;
23static void *ExtraCROMUnits[16];
24static unsigned int ExtraCROMUnitsSize[16];
25static unsigned int nExtraCROMUnits;
26unsigned int *ConfigurationROM;
27unsigned int ConfigurationROMSize;
28static unsigned char LinkSpeed, CycleClkAcc, Max_Rec;
30extern int NodeCapabilities;
31extern unsigned int NodeData[63];
34static void ieee1394Swab32(
void *dest,
void *src,
unsigned int nQuads);
35static void BuildConfigurationROM(
void);
37static void ieee1394Swab32(
void *dest,
void *src,
unsigned int nQuads)
39 register unsigned int i;
41 for (i = 0; i < nQuads; i++)
42 ((
unsigned int *)dest)[i] = BSWAP32(((
unsigned int *)src)[i]);
45unsigned short int iLinkCalculateCRC16(
void *data,
unsigned int nQuads)
49 unsigned short int lCRC = 0;
51 for (i = 0; (
unsigned int)i < nQuads; ++i) {
54 lData = ((
unsigned int *)data)[i];
55 for (lShift = 28; lShift >= 0; lShift -= 4) {
56 lSum = ((lCRC >> 12) ^ (lData >> lShift)) & 15;
57 lCRC = (lCRC << 4) ^ (lSum << 12) ^ (lSum << 5) ^ lSum;
65int iLinkAddCROMUnit(
unsigned int *data,
unsigned int nQuads)
67 unsigned int i, CROM_EntrySizeInBytes;
71 for (i = 0; i < 16; i++) {
72 if (ExtraCROMUnits[i] == NULL) {
73 CROM_EntrySizeInBytes = nQuads * 4;
74 if ((ExtraCROMUnits[i] = malloc(CROM_EntrySizeInBytes)) != NULL) {
75 ExtraCROMUnitsSize[i] = CROM_EntrySizeInBytes;
77 ieee1394Swab32(ExtraCROMUnits[i], data, nQuads);
80 BuildConfigurationROM();
92void iLinkDeleteCROMUnit(
unsigned int id)
94 free(ExtraCROMUnits[
id]);
95 ExtraCROMUnits[id] = NULL;
96 BuildConfigurationROM();
101int iLinkGetNodeCapabilities(
unsigned short NodeID)
106 if (NodeID == LocalNodeID)
107 return NodeCapabilities;
109 result = iLinkReadCROM(NodeID, 8, 1, &data);
110 result = (result < 0) ? (-1) : (int)(data >> 27);
115int iLinkGetNodeMaxSpeed(
unsigned short int NodeID)
121 for (i = 0; i < (
unsigned int)nNodes; i++) {
122 if (SELF_ID_NODEID(NodeData[i]) == (NodeID & 0x3F)) {
123 result = SELF_ID_SPEED(NodeData[i]);
131static inline int ParseUnitCROM(
unsigned short NodeID,
unsigned int *UnitSpec,
unsigned int *UnitSW_Version)
133 unsigned int data, UnitDirectoryOffset, CROMOffset;
135 unsigned short int DirectoryLength;
137 CROMOffset = 0x14 >> 2;
138 UnitDirectoryOffset = 0;
141 if ((result = iLinkReadCROM(NodeID, CROMOffset, 1, &data)) < 0)
143 DirectoryLength = (
unsigned short int)(data >> 16);
147 for (i = 0; i < DirectoryLength; i++) {
148 if ((result = iLinkReadCROM(NodeID, CROMOffset, 1, &data)) < 0)
151 if ((data >> 24) == IEEE1394_CROM_UNIT_DIRECTORY) {
152 UnitDirectoryOffset = data & 0x00FFFFFF;
158 if (i == DirectoryLength)
161 CROMOffset += UnitDirectoryOffset;
162 DEBUG_PRINTF(
"CROMOffset=0x%08x.\n", CROMOffset);
165 if ((result = iLinkReadCROM(NodeID, CROMOffset, 1, &data)) < 0)
167 DirectoryLength = (
unsigned short int)(data >> 16);
171 for (i = 0; i < DirectoryLength; i++) {
172 if ((result = iLinkReadCROM(NodeID, CROMOffset, 1, &data)) < 0)
177 if ((data >> 24) == IEEE1394_CROM_UNIT_SPEC) {
178 *UnitSpec = data & 0x00FFFFFF;
179 }
else if ((data >> 24) == IEEE1394_CROM_UNIT_SW_VERSION) {
180 *UnitSW_Version = data & 0x00FFFFFF;
183 if ((*UnitSpec != 0) && (*UnitSW_Version != 0))
190int iLinkFindUnit(
int UnitInList,
unsigned int UnitSpec,
unsigned int UnitSW_Version)
193 unsigned int CurrentUnitSW_Version, CurrentUnitSpec;
195 DEBUG_PRINTF(
"iLinkFindUnit() %d UnitSpec: 0x%08x; UnitSW Version: 0x%08x.\n", UnitInList, UnitSpec, UnitSW_Version);
198 if (UnitInList < nNodes) {
199 unsigned short int NodeID;
201 NodeID = (
unsigned short int)SELF_ID_NODEID(NodeData[UnitInList]) | (LocalNodeID & 0xFFC0);
202 CurrentUnitSW_Version = CurrentUnitSpec = 0;
204 if ((result = ParseUnitCROM(NodeID, &CurrentUnitSpec, &CurrentUnitSW_Version)) >= 0) {
205 result = ((CurrentUnitSW_Version == UnitSW_Version) && (CurrentUnitSpec == UnitSpec)) ? NodeID : (-1);
212int iLinkReadCROM(
unsigned short int NodeID,
unsigned int Offset,
unsigned int nQuads,
unsigned int *buffer)
215 int result, trContext;
217 DEBUG_PRINTF(
"Reading CROM of node 0x%04x, offset: %u, nquads: %u.\n", NodeID, Offset, nQuads);
220 if ((trContext = iLinkTrAlloc(NodeID, S100)) < 0)
223 for (i = 0; i < nQuads; i++) {
228 if ((result = iLinkTrRead(trContext, 0x0000FFFF, 0xF0000400 + (Offset << 2), buffer, 4)) >= 0) {
229 *buffer = BSWAP32(*buffer);
236 }
while ((result < 0) && (retries > 0));
241 iLinkTrFree(trContext);
246void InitializeConfigurationROM(
void)
248 register unsigned int i;
250 for (i = 0; i < 16; i++)
251 ExtraCROMUnits[i] = NULL;
253 ConfigurationROM = NULL;
259 BuildConfigurationROM();
262static void BuildConfigurationROM(
void)
264 unsigned char *CROM_Buffer;
265 unsigned int CROMSize, CurrentOffset;
275 unsigned int i, TotalExtraCROMUnitSize;
276 unsigned short int TotalRootDirectorySizeInQuads;
278 TotalExtraCROMUnitSize = 0;
279 for (i = 0; i < 16; i++)
280 if (ExtraCROMUnits[i] != NULL)
281 TotalExtraCROMUnitSize += ExtraCROMUnitsSize[i];
283 TotalRootDirectorySizeInQuads = (
sizeof(
struct Root_Directory) + TotalExtraCROMUnitSize) / 4;
292 ConfigurationROMSize = CROMSize;
294 if ((CROM_Buffer = malloc(CROMSize)) == NULL)
301 RootDirectory->Module_Vendor_ID_Texual_Descriptor_Offset = (IEEE1394_CROM_VENDOR << 24) | (
sizeof(
struct DirectoryHeader) * 2 / 4 + TotalRootDirectorySizeInQuads - 2 +
sizeof(
struct Module_Vendor_Id) / 4);
302 RootDirectory->Node_Capabilities = (IEEE1394_CROM_NODE_CAPS << 24) | 0x0C0083C0;
304 RootDirectory->Module_Vendor_ID_Offset = (IEEE1394_CROM_MODULE_VENDOR_ID << 24) | (nExtraCROMUnits + 1);
306 ieee1394Swab32(RootDirectory, RootDirectory,
sizeof(
struct Root_Directory) / 4);
310 for (i = 0; i < 16; i++) {
311 if (ExtraCROMUnits[i] != NULL) {
312 memcpy(&CROM_Buffer[CurrentOffset], ExtraCROMUnits[i], ExtraCROMUnitsSize[i]);
313 CurrentOffset += ExtraCROMUnitsSize[i];
325 ieee1394Swab32(ModuleVendorID, ModuleVendorID,
sizeof(
struct Module_Vendor_Id) / 4);
337 ModuleTexualDescriptor->Specifier_ID = 0x00000000;
338 ModuleTexualDescriptor->Language_ID = 0x00000000;
342 memcpy(ModuleTexualDescriptor->Vendor_Name,
"Sony", 4);
354 NodeUniqueID->HardwareID = BSWAP32((ConsoleGUID >> 32));
355 NodeUniqueID->Chip_ID_Low = BSWAP32((ConsoleGUID & 0xFFFFFFFF));
367 ModelName->Specifier_ID = 0x00000000;
368 ModelName->Language_ID = 0x00000000;
370 memcpy(ModelName->Model_Name, ConsoleModelName,
sizeof(ModelName->Model_Name));
380 memcpy(BusInfoBlk->BusName,
"1394", 4);
381 BusInfoBlk->capabilities = NodeCapabilities << 3;
382 BusInfoBlk->Cyc_Clk_Acc = CycleClkAcc;
383 BusInfoBlk->Max_Rec = Max_Rec << 4;
384 BusInfoBlk->misc = LinkSpeed;
385 BusInfoBlk->HardwareID = NodeUniqueID->HardwareID;
386 BusInfoBlk->Chip_ID_Low = NodeUniqueID->Chip_ID_Low;
393 if (ConfigurationROM != NULL)
394 free(ConfigurationROM);
395 ConfigurationROM = (
unsigned int *)CROM_Buffer;