csr1212.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463
  1. /*
  2. * csr1212.c -- IEEE 1212 Control and Status Register support for Linux
  3. *
  4. * Copyright (C) 2003 Francois Retief <fgretief@sun.ac.za>
  5. * Steve Kinneberg <kinnebergsteve@acmsystems.com>
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. The name of the author may not be used to endorse or promote products
  16. * derived from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
  19. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  20. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  21. * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  22. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  23. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  24. * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  25. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  26. * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  27. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. /* TODO List:
  30. * - Verify interface consistency: i.e., public functions that take a size
  31. * parameter expect size to be in bytes.
  32. */
  33. #include <linux/errno.h>
  34. #include <linux/string.h>
  35. #include <asm/bug.h>
  36. #include <asm/byteorder.h>
  37. #include "csr1212.h"
  38. /* Permitted key type for each key id */
  39. #define __I (1 << CSR1212_KV_TYPE_IMMEDIATE)
  40. #define __C (1 << CSR1212_KV_TYPE_CSR_OFFSET)
  41. #define __D (1 << CSR1212_KV_TYPE_DIRECTORY)
  42. #define __L (1 << CSR1212_KV_TYPE_LEAF)
  43. static const u8 csr1212_key_id_type_map[0x30] = {
  44. __C, /* used by Apple iSight */
  45. __D | __L, /* Descriptor */
  46. __I | __D | __L, /* Bus_Dependent_Info */
  47. __I | __D | __L, /* Vendor */
  48. __I, /* Hardware_Version */
  49. 0, 0, /* Reserved */
  50. __D | __L | __I, /* Module */
  51. __I, 0, 0, 0, /* used by Apple iSight, Reserved */
  52. __I, /* Node_Capabilities */
  53. __L, /* EUI_64 */
  54. 0, 0, 0, /* Reserved */
  55. __D, /* Unit */
  56. __I, /* Specifier_ID */
  57. __I, /* Version */
  58. __I | __C | __D | __L, /* Dependent_Info */
  59. __L, /* Unit_Location */
  60. 0, /* Reserved */
  61. __I, /* Model */
  62. __D, /* Instance */
  63. __L, /* Keyword */
  64. __D, /* Feature */
  65. __L, /* Extended_ROM */
  66. __I, /* Extended_Key_Specifier_ID */
  67. __I, /* Extended_Key */
  68. __I | __C | __D | __L, /* Extended_Data */
  69. __L, /* Modifiable_Descriptor */
  70. __I, /* Directory_ID */
  71. __I, /* Revision */
  72. };
  73. #undef __I
  74. #undef __C
  75. #undef __D
  76. #undef __L
  77. #define quads_to_bytes(_q) ((_q) * sizeof(u32))
  78. #define bytes_to_quads(_b) (((_b) + sizeof(u32) - 1) / sizeof(u32))
  79. static void free_keyval(struct csr1212_keyval *kv)
  80. {
  81. if ((kv->key.type == CSR1212_KV_TYPE_LEAF) &&
  82. (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM))
  83. CSR1212_FREE(kv->value.leaf.data);
  84. CSR1212_FREE(kv);
  85. }
  86. static u16 csr1212_crc16(const u32 *buffer, size_t length)
  87. {
  88. int shift;
  89. u32 data;
  90. u16 sum, crc = 0;
  91. for (; length; length--) {
  92. data = be32_to_cpu(*buffer);
  93. buffer++;
  94. for (shift = 28; shift >= 0; shift -= 4 ) {
  95. sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
  96. crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
  97. }
  98. crc &= 0xffff;
  99. }
  100. return cpu_to_be16(crc);
  101. }
  102. #if 0
  103. /* Microsoft computes the CRC with the bytes in reverse order. Therefore we
  104. * have a special version of the CRC algorithm to account for their buggy
  105. * software. */
  106. static u16 csr1212_msft_crc16(const u32 *buffer, size_t length)
  107. {
  108. int shift;
  109. u32 data;
  110. u16 sum, crc = 0;
  111. for (; length; length--) {
  112. data = le32_to_cpu(*buffer);
  113. buffer++;
  114. for (shift = 28; shift >= 0; shift -= 4 ) {
  115. sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
  116. crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
  117. }
  118. crc &= 0xffff;
  119. }
  120. return cpu_to_be16(crc);
  121. }
  122. #endif
  123. static struct csr1212_dentry *
  124. csr1212_find_keyval(struct csr1212_keyval *dir, struct csr1212_keyval *kv)
  125. {
  126. struct csr1212_dentry *pos;
  127. for (pos = dir->value.directory.dentries_head;
  128. pos != NULL; pos = pos->next) {
  129. if (pos->kv == kv)
  130. return pos;
  131. }
  132. return NULL;
  133. }
  134. static struct csr1212_keyval *
  135. csr1212_find_keyval_offset(struct csr1212_keyval *kv_list, u32 offset)
  136. {
  137. struct csr1212_keyval *kv;
  138. for (kv = kv_list->next; kv && (kv != kv_list); kv = kv->next) {
  139. if (kv->offset == offset)
  140. return kv;
  141. }
  142. return NULL;
  143. }
  144. /* Creation Routines */
  145. struct csr1212_csr *csr1212_create_csr(struct csr1212_bus_ops *ops,
  146. size_t bus_info_size, void *private)
  147. {
  148. struct csr1212_csr *csr;
  149. csr = CSR1212_MALLOC(sizeof(*csr));
  150. if (!csr)
  151. return NULL;
  152. csr->cache_head =
  153. csr1212_rom_cache_malloc(CSR1212_CONFIG_ROM_SPACE_OFFSET,
  154. CSR1212_CONFIG_ROM_SPACE_SIZE);
  155. if (!csr->cache_head) {
  156. CSR1212_FREE(csr);
  157. return NULL;
  158. }
  159. /* The keyval key id is not used for the root node, but a valid key id
  160. * that can be used for a directory needs to be passed to
  161. * csr1212_new_directory(). */
  162. csr->root_kv = csr1212_new_directory(CSR1212_KV_ID_VENDOR);
  163. if (!csr->root_kv) {
  164. CSR1212_FREE(csr->cache_head);
  165. CSR1212_FREE(csr);
  166. return NULL;
  167. }
  168. csr->bus_info_data = csr->cache_head->data;
  169. csr->bus_info_len = bus_info_size;
  170. csr->crc_len = bus_info_size;
  171. csr->ops = ops;
  172. csr->private = private;
  173. csr->cache_tail = csr->cache_head;
  174. return csr;
  175. }
  176. void csr1212_init_local_csr(struct csr1212_csr *csr,
  177. const u32 *bus_info_data, int max_rom)
  178. {
  179. static const int mr_map[] = { 4, 64, 1024, 0 };
  180. BUG_ON(max_rom & ~0x3);
  181. csr->max_rom = mr_map[max_rom];
  182. memcpy(csr->bus_info_data, bus_info_data, csr->bus_info_len);
  183. }
  184. static struct csr1212_keyval *csr1212_new_keyval(u8 type, u8 key)
  185. {
  186. struct csr1212_keyval *kv;
  187. if (key < 0x30 && ((csr1212_key_id_type_map[key] & (1 << type)) == 0))
  188. return NULL;
  189. kv = CSR1212_MALLOC(sizeof(*kv));
  190. if (!kv)
  191. return NULL;
  192. kv->key.type = type;
  193. kv->key.id = key;
  194. kv->associate = NULL;
  195. kv->refcnt = 1;
  196. kv->next = NULL;
  197. kv->prev = NULL;
  198. kv->offset = 0;
  199. kv->valid = 0;
  200. return kv;
  201. }
  202. struct csr1212_keyval *csr1212_new_immediate(u8 key, u32 value)
  203. {
  204. struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_IMMEDIATE, key);
  205. if (!kv)
  206. return NULL;
  207. kv->value.immediate = value;
  208. kv->valid = 1;
  209. return kv;
  210. }
  211. static struct csr1212_keyval *
  212. csr1212_new_leaf(u8 key, const void *data, size_t data_len)
  213. {
  214. struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_LEAF, key);
  215. if (!kv)
  216. return NULL;
  217. if (data_len > 0) {
  218. kv->value.leaf.data = CSR1212_MALLOC(data_len);
  219. if (!kv->value.leaf.data) {
  220. CSR1212_FREE(kv);
  221. return NULL;
  222. }
  223. if (data)
  224. memcpy(kv->value.leaf.data, data, data_len);
  225. } else {
  226. kv->value.leaf.data = NULL;
  227. }
  228. kv->value.leaf.len = bytes_to_quads(data_len);
  229. kv->offset = 0;
  230. kv->valid = 1;
  231. return kv;
  232. }
  233. static struct csr1212_keyval *
  234. csr1212_new_csr_offset(u8 key, u32 csr_offset)
  235. {
  236. struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_CSR_OFFSET, key);
  237. if (!kv)
  238. return NULL;
  239. kv->value.csr_offset = csr_offset;
  240. kv->offset = 0;
  241. kv->valid = 1;
  242. return kv;
  243. }
  244. struct csr1212_keyval *csr1212_new_directory(u8 key)
  245. {
  246. struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_DIRECTORY, key);
  247. if (!kv)
  248. return NULL;
  249. kv->value.directory.len = 0;
  250. kv->offset = 0;
  251. kv->value.directory.dentries_head = NULL;
  252. kv->value.directory.dentries_tail = NULL;
  253. kv->valid = 1;
  254. return kv;
  255. }
  256. void csr1212_associate_keyval(struct csr1212_keyval *kv,
  257. struct csr1212_keyval *associate)
  258. {
  259. BUG_ON(!kv || !associate || kv->key.id == CSR1212_KV_ID_DESCRIPTOR ||
  260. (associate->key.id != CSR1212_KV_ID_DESCRIPTOR &&
  261. associate->key.id != CSR1212_KV_ID_DEPENDENT_INFO &&
  262. associate->key.id != CSR1212_KV_ID_EXTENDED_KEY &&
  263. associate->key.id != CSR1212_KV_ID_EXTENDED_DATA &&
  264. associate->key.id < 0x30) ||
  265. (kv->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID &&
  266. associate->key.id != CSR1212_KV_ID_EXTENDED_KEY) ||
  267. (kv->key.id == CSR1212_KV_ID_EXTENDED_KEY &&
  268. associate->key.id != CSR1212_KV_ID_EXTENDED_DATA) ||
  269. (associate->key.id == CSR1212_KV_ID_EXTENDED_KEY &&
  270. kv->key.id != CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) ||
  271. (associate->key.id == CSR1212_KV_ID_EXTENDED_DATA &&
  272. kv->key.id != CSR1212_KV_ID_EXTENDED_KEY));
  273. if (kv->associate)
  274. csr1212_release_keyval(kv->associate);
  275. associate->refcnt++;
  276. kv->associate = associate;
  277. }
  278. int csr1212_attach_keyval_to_directory(struct csr1212_keyval *dir,
  279. struct csr1212_keyval *kv)
  280. {
  281. struct csr1212_dentry *dentry;
  282. BUG_ON(!kv || !dir || dir->key.type != CSR1212_KV_TYPE_DIRECTORY);
  283. dentry = CSR1212_MALLOC(sizeof(*dentry));
  284. if (!dentry)
  285. return -ENOMEM;
  286. dentry->kv = kv;
  287. kv->refcnt++;
  288. dentry->next = NULL;
  289. dentry->prev = dir->value.directory.dentries_tail;
  290. if (!dir->value.directory.dentries_head)
  291. dir->value.directory.dentries_head = dentry;
  292. if (dir->value.directory.dentries_tail)
  293. dir->value.directory.dentries_tail->next = dentry;
  294. dir->value.directory.dentries_tail = dentry;
  295. return CSR1212_SUCCESS;
  296. }
  297. #define CSR1212_DESCRIPTOR_LEAF_DATA(kv) \
  298. (&((kv)->value.leaf.data[1]))
  299. #define CSR1212_DESCRIPTOR_LEAF_SET_TYPE(kv, type) \
  300. ((kv)->value.leaf.data[0] = \
  301. cpu_to_be32(CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID(kv) | \
  302. ((type) << CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT)))
  303. #define CSR1212_DESCRIPTOR_LEAF_SET_SPECIFIER_ID(kv, spec_id) \
  304. ((kv)->value.leaf.data[0] = \
  305. cpu_to_be32((CSR1212_DESCRIPTOR_LEAF_TYPE(kv) << \
  306. CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT) | \
  307. ((spec_id) & CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID_MASK)))
  308. static struct csr1212_keyval *
  309. csr1212_new_descriptor_leaf(u8 dtype, u32 specifier_id,
  310. const void *data, size_t data_len)
  311. {
  312. struct csr1212_keyval *kv;
  313. kv = csr1212_new_leaf(CSR1212_KV_ID_DESCRIPTOR, NULL,
  314. data_len + CSR1212_DESCRIPTOR_LEAF_OVERHEAD);
  315. if (!kv)
  316. return NULL;
  317. CSR1212_DESCRIPTOR_LEAF_SET_TYPE(kv, dtype);
  318. CSR1212_DESCRIPTOR_LEAF_SET_SPECIFIER_ID(kv, specifier_id);
  319. if (data) {
  320. memcpy(CSR1212_DESCRIPTOR_LEAF_DATA(kv), data, data_len);
  321. }
  322. return kv;
  323. }
  324. #define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_WIDTH(kv, width) \
  325. ((kv)->value.leaf.data[1] = \
  326. ((kv)->value.leaf.data[1] & \
  327. cpu_to_be32(~(CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_MASK << \
  328. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_SHIFT))) | \
  329. cpu_to_be32(((width) & CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_MASK) << \
  330. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_SHIFT))
  331. #define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_CHAR_SET(kv, char_set) \
  332. ((kv)->value.leaf.data[1] = \
  333. ((kv)->value.leaf.data[1] & \
  334. cpu_to_be32(~(CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_MASK << \
  335. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_SHIFT))) | \
  336. cpu_to_be32(((char_set) & \
  337. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_MASK) << \
  338. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_SHIFT))
  339. #define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_LANGUAGE(kv, language) \
  340. ((kv)->value.leaf.data[1] = \
  341. ((kv)->value.leaf.data[1] & \
  342. cpu_to_be32(~(CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE_MASK))) | \
  343. cpu_to_be32(((language) & \
  344. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE_MASK)))
  345. static struct csr1212_keyval *
  346. csr1212_new_textual_descriptor_leaf(u8 cwidth, u16 cset, u16 language,
  347. const void *data, size_t data_len)
  348. {
  349. struct csr1212_keyval *kv;
  350. char *lstr;
  351. kv = csr1212_new_descriptor_leaf(0, 0, NULL, data_len +
  352. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_OVERHEAD);
  353. if (!kv)
  354. return NULL;
  355. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_WIDTH(kv, cwidth);
  356. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_CHAR_SET(kv, cset);
  357. CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_LANGUAGE(kv, language);
  358. lstr = (char*)CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(kv);
  359. /* make sure last quadlet is zeroed out */
  360. *((u32*)&(lstr[(data_len - 1) & ~0x3])) = 0;
  361. /* don't copy the NUL terminator */
  362. memcpy(lstr, data, data_len);
  363. return kv;
  364. }
  365. static int csr1212_check_minimal_ascii(const char *s)
  366. {
  367. static const char minimal_ascii_table[] = {
  368. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
  369. 0x00, 0x00, 0x0a, 0x00, 0x0C, 0x0D, 0x00, 0x00,
  370. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  371. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  372. 0x20, 0x21, 0x22, 0x00, 0x00, 0x25, 0x26, 0x27,
  373. 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  374. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  375. 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
  376. 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  377. 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
  378. 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  379. 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5f,
  380. 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
  381. 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
  382. 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
  383. 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00,
  384. };
  385. for (; *s; s++) {
  386. if (minimal_ascii_table[*s & 0x7F] != *s)
  387. return -1; /* failed */
  388. }
  389. /* String conforms to minimal-ascii, as specified by IEEE 1212,
  390. * par. 7.4 */
  391. return 0;
  392. }
  393. struct csr1212_keyval *csr1212_new_string_descriptor_leaf(const char *s)
  394. {
  395. /* Check if string conform to minimal_ascii format */
  396. if (csr1212_check_minimal_ascii(s))
  397. return NULL;
  398. /* IEEE 1212, par. 7.5.4.1 Textual descriptors (minimal ASCII) */
  399. return csr1212_new_textual_descriptor_leaf(0, 0, 0, s, strlen(s));
  400. }
  401. /* Destruction Routines */
  402. void csr1212_detach_keyval_from_directory(struct csr1212_keyval *dir,
  403. struct csr1212_keyval *kv)
  404. {
  405. struct csr1212_dentry *dentry;
  406. if (!kv || !dir || dir->key.type != CSR1212_KV_TYPE_DIRECTORY)
  407. return;
  408. dentry = csr1212_find_keyval(dir, kv);
  409. if (!dentry)
  410. return;
  411. if (dentry->prev)
  412. dentry->prev->next = dentry->next;
  413. if (dentry->next)
  414. dentry->next->prev = dentry->prev;
  415. if (dir->value.directory.dentries_head == dentry)
  416. dir->value.directory.dentries_head = dentry->next;
  417. if (dir->value.directory.dentries_tail == dentry)
  418. dir->value.directory.dentries_tail = dentry->prev;
  419. CSR1212_FREE(dentry);
  420. csr1212_release_keyval(kv);
  421. }
  422. /* This function is used to free the memory taken by a keyval. If the given
  423. * keyval is a directory type, then any keyvals contained in that directory
  424. * will be destroyed as well if their respective refcnts are 0. By means of
  425. * list manipulation, this routine will descend a directory structure in a
  426. * non-recursive manner. */
  427. void _csr1212_destroy_keyval(struct csr1212_keyval *kv)
  428. {
  429. struct csr1212_keyval *k, *a;
  430. struct csr1212_dentry dentry;
  431. struct csr1212_dentry *head, *tail;
  432. dentry.kv = kv;
  433. dentry.next = NULL;
  434. dentry.prev = NULL;
  435. head = &dentry;
  436. tail = head;
  437. while (head) {
  438. k = head->kv;
  439. while (k) {
  440. k->refcnt--;
  441. if (k->refcnt > 0)
  442. break;
  443. a = k->associate;
  444. if (k->key.type == CSR1212_KV_TYPE_DIRECTORY) {
  445. /* If the current entry is a directory, then move all
  446. * the entries to the destruction list. */
  447. if (k->value.directory.dentries_head) {
  448. tail->next = k->value.directory.dentries_head;
  449. k->value.directory.dentries_head->prev = tail;
  450. tail = k->value.directory.dentries_tail;
  451. }
  452. }
  453. free_keyval(k);
  454. k = a;
  455. }
  456. head = head->next;
  457. if (head) {
  458. if (head->prev && head->prev != &dentry) {
  459. CSR1212_FREE(head->prev);
  460. }
  461. head->prev = NULL;
  462. } else if (tail != &dentry)
  463. CSR1212_FREE(tail);
  464. }
  465. }
  466. void csr1212_destroy_csr(struct csr1212_csr *csr)
  467. {
  468. struct csr1212_csr_rom_cache *c, *oc;
  469. struct csr1212_cache_region *cr, *ocr;
  470. csr1212_release_keyval(csr->root_kv);
  471. c = csr->cache_head;
  472. while (c) {
  473. oc = c;
  474. cr = c->filled_head;
  475. while (cr) {
  476. ocr = cr;
  477. cr = cr->next;
  478. CSR1212_FREE(ocr);
  479. }
  480. c = c->next;
  481. CSR1212_FREE(oc);
  482. }
  483. CSR1212_FREE(csr);
  484. }
  485. /* CSR Image Creation */
  486. static int csr1212_append_new_cache(struct csr1212_csr *csr, size_t romsize)
  487. {
  488. struct csr1212_csr_rom_cache *cache;
  489. u64 csr_addr;
  490. BUG_ON(!csr || !csr->ops || !csr->ops->allocate_addr_range ||
  491. !csr->ops->release_addr || csr->max_rom < 1);
  492. /* ROM size must be a multiple of csr->max_rom */
  493. romsize = (romsize + (csr->max_rom - 1)) & ~(csr->max_rom - 1);
  494. csr_addr = csr->ops->allocate_addr_range(romsize, csr->max_rom, csr->private);
  495. if (csr_addr == CSR1212_INVALID_ADDR_SPACE) {
  496. return -ENOMEM;
  497. }
  498. if (csr_addr < CSR1212_REGISTER_SPACE_BASE) {
  499. /* Invalid address returned from allocate_addr_range(). */
  500. csr->ops->release_addr(csr_addr, csr->private);
  501. return -ENOMEM;
  502. }
  503. cache = csr1212_rom_cache_malloc(csr_addr - CSR1212_REGISTER_SPACE_BASE, romsize);
  504. if (!cache) {
  505. csr->ops->release_addr(csr_addr, csr->private);
  506. return -ENOMEM;
  507. }
  508. cache->ext_rom = csr1212_new_keyval(CSR1212_KV_TYPE_LEAF, CSR1212_KV_ID_EXTENDED_ROM);
  509. if (!cache->ext_rom) {
  510. csr->ops->release_addr(csr_addr, csr->private);
  511. CSR1212_FREE(cache);
  512. return -ENOMEM;
  513. }
  514. if (csr1212_attach_keyval_to_directory(csr->root_kv, cache->ext_rom) != CSR1212_SUCCESS) {
  515. csr1212_release_keyval(cache->ext_rom);
  516. csr->ops->release_addr(csr_addr, csr->private);
  517. CSR1212_FREE(cache);
  518. return -ENOMEM;
  519. }
  520. cache->ext_rom->offset = csr_addr - CSR1212_REGISTER_SPACE_BASE;
  521. cache->ext_rom->value.leaf.len = -1;
  522. cache->ext_rom->value.leaf.data = cache->data;
  523. /* Add cache to tail of cache list */
  524. cache->prev = csr->cache_tail;
  525. csr->cache_tail->next = cache;
  526. csr->cache_tail = cache;
  527. return CSR1212_SUCCESS;
  528. }
  529. static void csr1212_remove_cache(struct csr1212_csr *csr,
  530. struct csr1212_csr_rom_cache *cache)
  531. {
  532. if (csr->cache_head == cache)
  533. csr->cache_head = cache->next;
  534. if (csr->cache_tail == cache)
  535. csr->cache_tail = cache->prev;
  536. if (cache->prev)
  537. cache->prev->next = cache->next;
  538. if (cache->next)
  539. cache->next->prev = cache->prev;
  540. if (cache->ext_rom) {
  541. csr1212_detach_keyval_from_directory(csr->root_kv, cache->ext_rom);
  542. csr1212_release_keyval(cache->ext_rom);
  543. }
  544. CSR1212_FREE(cache);
  545. }
  546. static int csr1212_generate_layout_subdir(struct csr1212_keyval *dir,
  547. struct csr1212_keyval **layout_tail)
  548. {
  549. struct csr1212_dentry *dentry;
  550. struct csr1212_keyval *dkv;
  551. struct csr1212_keyval *last_extkey_spec = NULL;
  552. struct csr1212_keyval *last_extkey = NULL;
  553. int num_entries = 0;
  554. for (dentry = dir->value.directory.dentries_head; dentry;
  555. dentry = dentry->next) {
  556. for (dkv = dentry->kv; dkv; dkv = dkv->associate) {
  557. /* Special Case: Extended Key Specifier_ID */
  558. if (dkv->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) {
  559. if (last_extkey_spec == NULL) {
  560. last_extkey_spec = dkv;
  561. } else if (dkv->value.immediate != last_extkey_spec->value.immediate) {
  562. last_extkey_spec = dkv;
  563. } else {
  564. continue;
  565. }
  566. /* Special Case: Extended Key */
  567. } else if (dkv->key.id == CSR1212_KV_ID_EXTENDED_KEY) {
  568. if (last_extkey == NULL) {
  569. last_extkey = dkv;
  570. } else if (dkv->value.immediate != last_extkey->value.immediate) {
  571. last_extkey = dkv;
  572. } else {
  573. continue;
  574. }
  575. }
  576. num_entries += 1;
  577. switch(dkv->key.type) {
  578. default:
  579. case CSR1212_KV_TYPE_IMMEDIATE:
  580. case CSR1212_KV_TYPE_CSR_OFFSET:
  581. break;
  582. case CSR1212_KV_TYPE_LEAF:
  583. case CSR1212_KV_TYPE_DIRECTORY:
  584. /* Remove from list */
  585. if (dkv->prev && (dkv->prev->next == dkv))
  586. dkv->prev->next = dkv->next;
  587. if (dkv->next && (dkv->next->prev == dkv))
  588. dkv->next->prev = dkv->prev;
  589. //if (dkv == *layout_tail)
  590. // *layout_tail = dkv->prev;
  591. /* Special case: Extended ROM leafs */
  592. if (dkv->key.id == CSR1212_KV_ID_EXTENDED_ROM) {
  593. dkv->value.leaf.len = -1;
  594. /* Don't add Extended ROM leafs in the layout list,
  595. * they are handled differently. */
  596. break;
  597. }
  598. /* Add to tail of list */
  599. dkv->next = NULL;
  600. dkv->prev = *layout_tail;
  601. (*layout_tail)->next = dkv;
  602. *layout_tail = dkv;
  603. break;
  604. }
  605. }
  606. }
  607. return num_entries;
  608. }
  609. static size_t csr1212_generate_layout_order(struct csr1212_keyval *kv)
  610. {
  611. struct csr1212_keyval *ltail = kv;
  612. size_t agg_size = 0;
  613. while(kv) {
  614. switch(kv->key.type) {
  615. case CSR1212_KV_TYPE_LEAF:
  616. /* Add 1 quadlet for crc/len field */
  617. agg_size += kv->value.leaf.len + 1;
  618. break;
  619. case CSR1212_KV_TYPE_DIRECTORY:
  620. kv->value.directory.len = csr1212_generate_layout_subdir(kv, &ltail);
  621. /* Add 1 quadlet for crc/len field */
  622. agg_size += kv->value.directory.len + 1;
  623. break;
  624. }
  625. kv = kv->next;
  626. }
  627. return quads_to_bytes(agg_size);
  628. }
  629. static struct csr1212_keyval *
  630. csr1212_generate_positions(struct csr1212_csr_rom_cache *cache,
  631. struct csr1212_keyval *start_kv, int start_pos)
  632. {
  633. struct csr1212_keyval *kv = start_kv;
  634. struct csr1212_keyval *okv = start_kv;
  635. int pos = start_pos;
  636. int kv_len = 0, okv_len = 0;
  637. cache->layout_head = kv;
  638. while(kv && pos < cache->size) {
  639. /* Special case: Extended ROM leafs */
  640. if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM) {
  641. kv->offset = cache->offset + pos;
  642. }
  643. switch(kv->key.type) {
  644. case CSR1212_KV_TYPE_LEAF:
  645. kv_len = kv->value.leaf.len;
  646. break;
  647. case CSR1212_KV_TYPE_DIRECTORY:
  648. kv_len = kv->value.directory.len;
  649. break;
  650. default:
  651. /* Should never get here */
  652. break;
  653. }
  654. pos += quads_to_bytes(kv_len + 1);
  655. if (pos <= cache->size) {
  656. okv = kv;
  657. okv_len = kv_len;
  658. kv = kv->next;
  659. }
  660. }
  661. cache->layout_tail = okv;
  662. cache->len = (okv->offset - cache->offset) + quads_to_bytes(okv_len + 1);
  663. return kv;
  664. }
  665. #define CSR1212_KV_KEY_SHIFT 24
  666. #define CSR1212_KV_KEY_TYPE_SHIFT 6
  667. #define CSR1212_KV_KEY_ID_MASK 0x3f
  668. #define CSR1212_KV_KEY_TYPE_MASK 0x3 /* after shift */
  669. static void
  670. csr1212_generate_tree_subdir(struct csr1212_keyval *dir, u32 *data_buffer)
  671. {
  672. struct csr1212_dentry *dentry;
  673. struct csr1212_keyval *last_extkey_spec = NULL;
  674. struct csr1212_keyval *last_extkey = NULL;
  675. int index = 0;
  676. for (dentry = dir->value.directory.dentries_head; dentry; dentry = dentry->next) {
  677. struct csr1212_keyval *a;
  678. for (a = dentry->kv; a; a = a->associate) {
  679. u32 value = 0;
  680. /* Special Case: Extended Key Specifier_ID */
  681. if (a->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) {
  682. if (last_extkey_spec == NULL) {
  683. last_extkey_spec = a;
  684. } else if (a->value.immediate != last_extkey_spec->value.immediate) {
  685. last_extkey_spec = a;
  686. } else {
  687. continue;
  688. }
  689. /* Special Case: Extended Key */
  690. } else if (a->key.id == CSR1212_KV_ID_EXTENDED_KEY) {
  691. if (last_extkey == NULL) {
  692. last_extkey = a;
  693. } else if (a->value.immediate != last_extkey->value.immediate) {
  694. last_extkey = a;
  695. } else {
  696. continue;
  697. }
  698. }
  699. switch(a->key.type) {
  700. case CSR1212_KV_TYPE_IMMEDIATE:
  701. value = a->value.immediate;
  702. break;
  703. case CSR1212_KV_TYPE_CSR_OFFSET:
  704. value = a->value.csr_offset;
  705. break;
  706. case CSR1212_KV_TYPE_LEAF:
  707. value = a->offset;
  708. value -= dir->offset + quads_to_bytes(1+index);
  709. value = bytes_to_quads(value);
  710. break;
  711. case CSR1212_KV_TYPE_DIRECTORY:
  712. value = a->offset;
  713. value -= dir->offset + quads_to_bytes(1+index);
  714. value = bytes_to_quads(value);
  715. break;
  716. default:
  717. /* Should never get here */
  718. break; /* GDB breakpoint */
  719. }
  720. value |= (a->key.id & CSR1212_KV_KEY_ID_MASK) << CSR1212_KV_KEY_SHIFT;
  721. value |= (a->key.type & CSR1212_KV_KEY_TYPE_MASK) <<
  722. (CSR1212_KV_KEY_SHIFT + CSR1212_KV_KEY_TYPE_SHIFT);
  723. data_buffer[index] = cpu_to_be32(value);
  724. index++;
  725. }
  726. }
  727. }
  728. struct csr1212_keyval_img {
  729. u16 length;
  730. u16 crc;
  731. /* Must be last */
  732. u32 data[0]; /* older gcc can't handle [] which is standard */
  733. };
  734. static void csr1212_fill_cache(struct csr1212_csr_rom_cache *cache)
  735. {
  736. struct csr1212_keyval *kv, *nkv;
  737. struct csr1212_keyval_img *kvi;
  738. for (kv = cache->layout_head; kv != cache->layout_tail->next; kv = nkv) {
  739. kvi = (struct csr1212_keyval_img *)
  740. (cache->data + bytes_to_quads(kv->offset - cache->offset));
  741. switch(kv->key.type) {
  742. default:
  743. case CSR1212_KV_TYPE_IMMEDIATE:
  744. case CSR1212_KV_TYPE_CSR_OFFSET:
  745. /* Should never get here */
  746. break; /* GDB breakpoint */
  747. case CSR1212_KV_TYPE_LEAF:
  748. /* Don't copy over Extended ROM areas, they are
  749. * already filled out! */
  750. if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
  751. memcpy(kvi->data, kv->value.leaf.data,
  752. quads_to_bytes(kv->value.leaf.len));
  753. kvi->length = cpu_to_be16(kv->value.leaf.len);
  754. kvi->crc = csr1212_crc16(kvi->data, kv->value.leaf.len);
  755. break;
  756. case CSR1212_KV_TYPE_DIRECTORY:
  757. csr1212_generate_tree_subdir(kv, kvi->data);
  758. kvi->length = cpu_to_be16(kv->value.directory.len);
  759. kvi->crc = csr1212_crc16(kvi->data, kv->value.directory.len);
  760. break;
  761. }
  762. nkv = kv->next;
  763. if (kv->prev)
  764. kv->prev->next = NULL;
  765. if (kv->next)
  766. kv->next->prev = NULL;
  767. kv->prev = NULL;
  768. kv->next = NULL;
  769. }
  770. }
  771. #define CSR1212_EXTENDED_ROM_SIZE (0x10000 * sizeof(u32))
  772. int csr1212_generate_csr_image(struct csr1212_csr *csr)
  773. {
  774. struct csr1212_bus_info_block_img *bi;
  775. struct csr1212_csr_rom_cache *cache;
  776. struct csr1212_keyval *kv;
  777. size_t agg_size;
  778. int ret;
  779. int init_offset;
  780. BUG_ON(!csr);
  781. cache = csr->cache_head;
  782. bi = (struct csr1212_bus_info_block_img*)cache->data;
  783. bi->length = bytes_to_quads(csr->bus_info_len) - 1;
  784. bi->crc_length = bi->length;
  785. bi->crc = csr1212_crc16(bi->data, bi->crc_length);
  786. csr->root_kv->next = NULL;
  787. csr->root_kv->prev = NULL;
  788. agg_size = csr1212_generate_layout_order(csr->root_kv);
  789. init_offset = csr->bus_info_len;
  790. for (kv = csr->root_kv, cache = csr->cache_head; kv; cache = cache->next) {
  791. if (!cache) {
  792. /* Estimate approximate number of additional cache
  793. * regions needed (it assumes that the cache holding
  794. * the first 1K Config ROM space always exists). */
  795. int est_c = agg_size / (CSR1212_EXTENDED_ROM_SIZE -
  796. (2 * sizeof(u32))) + 1;
  797. /* Add additional cache regions, extras will be
  798. * removed later */
  799. for (; est_c; est_c--) {
  800. ret = csr1212_append_new_cache(csr, CSR1212_EXTENDED_ROM_SIZE);
  801. if (ret != CSR1212_SUCCESS)
  802. return ret;
  803. }
  804. /* Need to re-layout for additional cache regions */
  805. agg_size = csr1212_generate_layout_order(csr->root_kv);
  806. kv = csr->root_kv;
  807. cache = csr->cache_head;
  808. init_offset = csr->bus_info_len;
  809. }
  810. kv = csr1212_generate_positions(cache, kv, init_offset);
  811. agg_size -= cache->len;
  812. init_offset = sizeof(u32);
  813. }
  814. /* Remove unused, excess cache regions */
  815. while (cache) {
  816. struct csr1212_csr_rom_cache *oc = cache;
  817. cache = cache->next;
  818. csr1212_remove_cache(csr, oc);
  819. }
  820. /* Go through the list backward so that when done, the correct CRC
  821. * will be calculated for the Extended ROM areas. */
  822. for(cache = csr->cache_tail; cache; cache = cache->prev) {
  823. /* Only Extended ROM caches should have this set. */
  824. if (cache->ext_rom) {
  825. int leaf_size;
  826. /* Make sure the Extended ROM leaf is a multiple of
  827. * max_rom in size. */
  828. BUG_ON(csr->max_rom < 1);
  829. leaf_size = (cache->len + (csr->max_rom - 1)) &
  830. ~(csr->max_rom - 1);
  831. /* Zero out the unused ROM region */
  832. memset(cache->data + bytes_to_quads(cache->len), 0x00,
  833. leaf_size - cache->len);
  834. /* Subtract leaf header */
  835. leaf_size -= sizeof(u32);
  836. /* Update the Extended ROM leaf length */
  837. cache->ext_rom->value.leaf.len =
  838. bytes_to_quads(leaf_size);
  839. } else {
  840. /* Zero out the unused ROM region */
  841. memset(cache->data + bytes_to_quads(cache->len), 0x00,
  842. cache->size - cache->len);
  843. }
  844. /* Copy the data into the cache buffer */
  845. csr1212_fill_cache(cache);
  846. if (cache != csr->cache_head) {
  847. /* Set the length and CRC of the extended ROM. */
  848. struct csr1212_keyval_img *kvi =
  849. (struct csr1212_keyval_img*)cache->data;
  850. u16 len = bytes_to_quads(cache->len) - 1;
  851. kvi->length = cpu_to_be16(len);
  852. kvi->crc = csr1212_crc16(kvi->data, len);
  853. }
  854. }
  855. return CSR1212_SUCCESS;
  856. }
  857. int csr1212_read(struct csr1212_csr *csr, u32 offset, void *buffer, u32 len)
  858. {
  859. struct csr1212_csr_rom_cache *cache;
  860. for (cache = csr->cache_head; cache; cache = cache->next) {
  861. if (offset >= cache->offset &&
  862. (offset + len) <= (cache->offset + cache->size)) {
  863. memcpy(buffer,
  864. &cache->data[bytes_to_quads(offset - cache->offset)],
  865. len);
  866. return CSR1212_SUCCESS;
  867. }
  868. }
  869. return -ENOENT;
  870. }
  871. /* Parse a chunk of data as a Config ROM */
  872. static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
  873. {
  874. struct csr1212_bus_info_block_img *bi;
  875. struct csr1212_cache_region *cr;
  876. int i;
  877. int ret;
  878. /* IEEE 1212 says that the entire bus info block should be readable in
  879. * a single transaction regardless of the max_rom value.
  880. * Unfortunately, many IEEE 1394 devices do not abide by that, so the
  881. * bus info block will be read 1 quadlet at a time. The rest of the
  882. * ConfigROM will be read according to the max_rom field. */
  883. for (i = 0; i < csr->bus_info_len; i += sizeof(u32)) {
  884. ret = csr->ops->bus_read(csr, CSR1212_CONFIG_ROM_SPACE_BASE + i,
  885. sizeof(u32),
  886. &csr->cache_head->data[bytes_to_quads(i)],
  887. csr->private);
  888. if (ret != CSR1212_SUCCESS)
  889. return ret;
  890. /* check ROM header's info_length */
  891. if (i == 0 &&
  892. be32_to_cpu(csr->cache_head->data[0]) >> 24 !=
  893. bytes_to_quads(csr->bus_info_len) - 1)
  894. return -EINVAL;
  895. }
  896. bi = (struct csr1212_bus_info_block_img*)csr->cache_head->data;
  897. csr->crc_len = quads_to_bytes(bi->crc_length);
  898. /* IEEE 1212 recommends that crc_len be equal to bus_info_len, but that is not
  899. * always the case, so read the rest of the crc area 1 quadlet at a time. */
  900. for (i = csr->bus_info_len; i <= csr->crc_len; i += sizeof(u32)) {
  901. ret = csr->ops->bus_read(csr, CSR1212_CONFIG_ROM_SPACE_BASE + i,
  902. sizeof(u32),
  903. &csr->cache_head->data[bytes_to_quads(i)],
  904. csr->private);
  905. if (ret != CSR1212_SUCCESS)
  906. return ret;
  907. }
  908. #if 0
  909. /* Apparently there are too many differnt wrong implementations of the
  910. * CRC algorithm that verifying them is moot. */
  911. if ((csr1212_crc16(bi->data, bi->crc_length) != bi->crc) &&
  912. (csr1212_msft_crc16(bi->data, bi->crc_length) != bi->crc))
  913. return -EINVAL;
  914. #endif
  915. cr = CSR1212_MALLOC(sizeof(*cr));
  916. if (!cr)
  917. return -ENOMEM;
  918. cr->next = NULL;
  919. cr->prev = NULL;
  920. cr->offset_start = 0;
  921. cr->offset_end = csr->crc_len + 4;
  922. csr->cache_head->filled_head = cr;
  923. csr->cache_head->filled_tail = cr;
  924. return CSR1212_SUCCESS;
  925. }
  926. #define CSR1212_KV_KEY(q) (be32_to_cpu(q) >> CSR1212_KV_KEY_SHIFT)
  927. #define CSR1212_KV_KEY_TYPE(q) (CSR1212_KV_KEY(q) >> CSR1212_KV_KEY_TYPE_SHIFT)
  928. #define CSR1212_KV_KEY_ID(q) (CSR1212_KV_KEY(q) & CSR1212_KV_KEY_ID_MASK)
  929. #define CSR1212_KV_VAL_MASK 0xffffff
  930. #define CSR1212_KV_VAL(q) (be32_to_cpu(q) & CSR1212_KV_VAL_MASK)
  931. static int csr1212_parse_dir_entry(struct csr1212_keyval *dir,
  932. u32 ki, u32 kv_pos)
  933. {
  934. int ret = CSR1212_SUCCESS;
  935. struct csr1212_keyval *k = NULL;
  936. u32 offset;
  937. switch(CSR1212_KV_KEY_TYPE(ki)) {
  938. case CSR1212_KV_TYPE_IMMEDIATE:
  939. k = csr1212_new_immediate(CSR1212_KV_KEY_ID(ki),
  940. CSR1212_KV_VAL(ki));
  941. if (!k) {
  942. ret = -ENOMEM;
  943. goto fail;
  944. }
  945. k->refcnt = 0; /* Don't keep local reference when parsing. */
  946. break;
  947. case CSR1212_KV_TYPE_CSR_OFFSET:
  948. k = csr1212_new_csr_offset(CSR1212_KV_KEY_ID(ki),
  949. CSR1212_KV_VAL(ki));
  950. if (!k) {
  951. ret = -ENOMEM;
  952. goto fail;
  953. }
  954. k->refcnt = 0; /* Don't keep local reference when parsing. */
  955. break;
  956. default:
  957. /* Compute the offset from 0xffff f000 0000. */
  958. offset = quads_to_bytes(CSR1212_KV_VAL(ki)) + kv_pos;
  959. if (offset == kv_pos) {
  960. /* Uh-oh. Can't have a relative offset of 0 for Leaves
  961. * or Directories. The Config ROM image is most likely
  962. * messed up, so we'll just abort here. */
  963. ret = -EIO;
  964. goto fail;
  965. }
  966. k = csr1212_find_keyval_offset(dir, offset);
  967. if (k)
  968. break; /* Found it. */
  969. if (CSR1212_KV_KEY_TYPE(ki) == CSR1212_KV_TYPE_DIRECTORY) {
  970. k = csr1212_new_directory(CSR1212_KV_KEY_ID(ki));
  971. } else {
  972. k = csr1212_new_leaf(CSR1212_KV_KEY_ID(ki), NULL, 0);
  973. }
  974. if (!k) {
  975. ret = -ENOMEM;
  976. goto fail;
  977. }
  978. k->refcnt = 0; /* Don't keep local reference when parsing. */
  979. k->valid = 0; /* Contents not read yet so it's not valid. */
  980. k->offset = offset;
  981. k->prev = dir;
  982. k->next = dir->next;
  983. dir->next->prev = k;
  984. dir->next = k;
  985. }
  986. ret = csr1212_attach_keyval_to_directory(dir, k);
  987. fail:
  988. if (ret != CSR1212_SUCCESS && k != NULL)
  989. free_keyval(k);
  990. return ret;
  991. }
  992. int csr1212_parse_keyval(struct csr1212_keyval *kv,
  993. struct csr1212_csr_rom_cache *cache)
  994. {
  995. struct csr1212_keyval_img *kvi;
  996. int i;
  997. int ret = CSR1212_SUCCESS;
  998. int kvi_len;
  999. kvi = (struct csr1212_keyval_img*)&cache->data[bytes_to_quads(kv->offset -
  1000. cache->offset)];
  1001. kvi_len = be16_to_cpu(kvi->length);
  1002. #if 0
  1003. /* Apparently there are too many differnt wrong implementations of the
  1004. * CRC algorithm that verifying them is moot. */
  1005. if ((csr1212_crc16(kvi->data, kvi_len) != kvi->crc) &&
  1006. (csr1212_msft_crc16(kvi->data, kvi_len) != kvi->crc)) {
  1007. ret = -EINVAL;
  1008. goto fail;
  1009. }
  1010. #endif
  1011. switch(kv->key.type) {
  1012. case CSR1212_KV_TYPE_DIRECTORY:
  1013. for (i = 0; i < kvi_len; i++) {
  1014. u32 ki = kvi->data[i];
  1015. /* Some devices put null entries in their unit
  1016. * directories. If we come across such an entry,
  1017. * then skip it. */
  1018. if (ki == 0x0)
  1019. continue;
  1020. ret = csr1212_parse_dir_entry(kv, ki,
  1021. (kv->offset +
  1022. quads_to_bytes(i + 1)));
  1023. }
  1024. kv->value.directory.len = kvi_len;
  1025. break;
  1026. case CSR1212_KV_TYPE_LEAF:
  1027. if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM) {
  1028. kv->value.leaf.data = CSR1212_MALLOC(quads_to_bytes(kvi_len));
  1029. if (!kv->value.leaf.data) {
  1030. ret = -ENOMEM;
  1031. goto fail;
  1032. }
  1033. kv->value.leaf.len = kvi_len;
  1034. memcpy(kv->value.leaf.data, kvi->data, quads_to_bytes(kvi_len));
  1035. }
  1036. break;
  1037. }
  1038. kv->valid = 1;
  1039. fail:
  1040. return ret;
  1041. }
  1042. int _csr1212_read_keyval(struct csr1212_csr *csr, struct csr1212_keyval *kv)
  1043. {
  1044. struct csr1212_cache_region *cr, *ncr, *newcr = NULL;
  1045. struct csr1212_keyval_img *kvi = NULL;
  1046. struct csr1212_csr_rom_cache *cache;
  1047. int cache_index;
  1048. u64 addr;
  1049. u32 *cache_ptr;
  1050. u16 kv_len = 0;
  1051. BUG_ON(!csr || !kv || csr->max_rom < 1);
  1052. /* First find which cache the data should be in (or go in if not read
  1053. * yet). */
  1054. for (cache = csr->cache_head; cache; cache = cache->next) {
  1055. if (kv->offset >= cache->offset &&
  1056. kv->offset < (cache->offset + cache->size))
  1057. break;
  1058. }
  1059. if (!cache) {
  1060. u32 q, cache_size;
  1061. /* Only create a new cache for Extended ROM leaves. */
  1062. if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
  1063. return -EINVAL;
  1064. if (csr->ops->bus_read(csr,
  1065. CSR1212_REGISTER_SPACE_BASE + kv->offset,
  1066. sizeof(u32), &q, csr->private)) {
  1067. return -EIO;
  1068. }
  1069. kv->value.leaf.len = be32_to_cpu(q) >> 16;
  1070. cache_size = (quads_to_bytes(kv->value.leaf.len + 1) +
  1071. (csr->max_rom - 1)) & ~(csr->max_rom - 1);
  1072. cache = csr1212_rom_cache_malloc(kv->offset, cache_size);
  1073. if (!cache)
  1074. return -ENOMEM;
  1075. kv->value.leaf.data = &cache->data[1];
  1076. csr->cache_tail->next = cache;
  1077. cache->prev = csr->cache_tail;
  1078. cache->next = NULL;
  1079. csr->cache_tail = cache;
  1080. cache->filled_head =
  1081. CSR1212_MALLOC(sizeof(*cache->filled_head));
  1082. if (!cache->filled_head) {
  1083. return -ENOMEM;
  1084. }
  1085. cache->filled_head->offset_start = 0;
  1086. cache->filled_head->offset_end = sizeof(u32);
  1087. cache->filled_tail = cache->filled_head;
  1088. cache->filled_head->next = NULL;
  1089. cache->filled_head->prev = NULL;
  1090. cache->data[0] = q;
  1091. /* Don't read the entire extended ROM now. Pieces of it will
  1092. * be read when entries inside it are read. */
  1093. return csr1212_parse_keyval(kv, cache);
  1094. }
  1095. cache_index = kv->offset - cache->offset;
  1096. /* Now seach read portions of the cache to see if it is there. */
  1097. for (cr = cache->filled_head; cr; cr = cr->next) {
  1098. if (cache_index < cr->offset_start) {
  1099. newcr = CSR1212_MALLOC(sizeof(*newcr));
  1100. if (!newcr)
  1101. return -ENOMEM;
  1102. newcr->offset_start = cache_index & ~(csr->max_rom - 1);
  1103. newcr->offset_end = newcr->offset_start;
  1104. newcr->next = cr;
  1105. newcr->prev = cr->prev;
  1106. cr->prev = newcr;
  1107. cr = newcr;
  1108. break;
  1109. } else if ((cache_index >= cr->offset_start) &&
  1110. (cache_index < cr->offset_end)) {
  1111. kvi = (struct csr1212_keyval_img*)
  1112. (&cache->data[bytes_to_quads(cache_index)]);
  1113. kv_len = quads_to_bytes(be16_to_cpu(kvi->length) + 1);
  1114. break;
  1115. } else if (cache_index == cr->offset_end)
  1116. break;
  1117. }
  1118. if (!cr) {
  1119. cr = cache->filled_tail;
  1120. newcr = CSR1212_MALLOC(sizeof(*newcr));
  1121. if (!newcr)
  1122. return -ENOMEM;
  1123. newcr->offset_start = cache_index & ~(csr->max_rom - 1);
  1124. newcr->offset_end = newcr->offset_start;
  1125. newcr->prev = cr;
  1126. newcr->next = cr->next;
  1127. cr->next = newcr;
  1128. cr = newcr;
  1129. cache->filled_tail = newcr;
  1130. }
  1131. while(!kvi || cr->offset_end < cache_index + kv_len) {
  1132. cache_ptr = &cache->data[bytes_to_quads(cr->offset_end &
  1133. ~(csr->max_rom - 1))];
  1134. addr = (CSR1212_CSR_ARCH_REG_SPACE_BASE + cache->offset +
  1135. cr->offset_end) & ~(csr->max_rom - 1);
  1136. if (csr->ops->bus_read(csr, addr, csr->max_rom, cache_ptr,
  1137. csr->private)) {
  1138. if (csr->max_rom == 4)
  1139. /* We've got problems! */
  1140. return -EIO;
  1141. /* Apperently the max_rom value was a lie, set it to
  1142. * do quadlet reads and try again. */
  1143. csr->max_rom = 4;
  1144. continue;
  1145. }
  1146. cr->offset_end += csr->max_rom - (cr->offset_end &
  1147. (csr->max_rom - 1));
  1148. if (!kvi && (cr->offset_end > cache_index)) {
  1149. kvi = (struct csr1212_keyval_img*)
  1150. (&cache->data[bytes_to_quads(cache_index)]);
  1151. kv_len = quads_to_bytes(be16_to_cpu(kvi->length) + 1);
  1152. }
  1153. if ((kv_len + (kv->offset - cache->offset)) > cache->size) {
  1154. /* The Leaf or Directory claims its length extends
  1155. * beyond the ConfigROM image region and thus beyond the
  1156. * end of our cache region. Therefore, we abort now
  1157. * rather than seg faulting later. */
  1158. return -EIO;
  1159. }
  1160. ncr = cr->next;
  1161. if (ncr && (cr->offset_end >= ncr->offset_start)) {
  1162. /* consolidate region entries */
  1163. ncr->offset_start = cr->offset_start;
  1164. if (cr->prev)
  1165. cr->prev->next = cr->next;
  1166. ncr->prev = cr->prev;
  1167. if (cache->filled_head == cr)
  1168. cache->filled_head = ncr;
  1169. CSR1212_FREE(cr);
  1170. cr = ncr;
  1171. }
  1172. }
  1173. return csr1212_parse_keyval(kv, cache);
  1174. }
  1175. int csr1212_parse_csr(struct csr1212_csr *csr)
  1176. {
  1177. static const int mr_map[] = { 4, 64, 1024, 0 };
  1178. struct csr1212_dentry *dentry;
  1179. int ret;
  1180. BUG_ON(!csr || !csr->ops || !csr->ops->bus_read);
  1181. ret = csr1212_parse_bus_info_block(csr);
  1182. if (ret != CSR1212_SUCCESS)
  1183. return ret;
  1184. if (!csr->ops->get_max_rom)
  1185. csr->max_rom = mr_map[0]; /* default value */
  1186. else {
  1187. int i = csr->ops->get_max_rom(csr->bus_info_data,
  1188. csr->private);
  1189. if (i & ~0x3)
  1190. return -EINVAL;
  1191. csr->max_rom = mr_map[i];
  1192. }
  1193. csr->cache_head->layout_head = csr->root_kv;
  1194. csr->cache_head->layout_tail = csr->root_kv;
  1195. csr->root_kv->offset = (CSR1212_CONFIG_ROM_SPACE_BASE & 0xffff) +
  1196. csr->bus_info_len;
  1197. csr->root_kv->valid = 0;
  1198. csr->root_kv->next = csr->root_kv;
  1199. csr->root_kv->prev = csr->root_kv;
  1200. ret = _csr1212_read_keyval(csr, csr->root_kv);
  1201. if (ret != CSR1212_SUCCESS)
  1202. return ret;
  1203. /* Scan through the Root directory finding all extended ROM regions
  1204. * and make cache regions for them */
  1205. for (dentry = csr->root_kv->value.directory.dentries_head;
  1206. dentry; dentry = dentry->next) {
  1207. if (dentry->kv->key.id == CSR1212_KV_ID_EXTENDED_ROM &&
  1208. !dentry->kv->valid) {
  1209. ret = _csr1212_read_keyval(csr, dentry->kv);
  1210. if (ret != CSR1212_SUCCESS)
  1211. return ret;
  1212. }
  1213. }
  1214. return CSR1212_SUCCESS;
  1215. }