setup.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: %F% %I% %G% %U% %#%
  3.  */
  4. /*
  5.  * Common prep/pmac/chrp boot and setup code.
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/module.h>
  9. #include <linux/string.h>
  10. #include <linux/sched.h>
  11. #include <linux/init.h>
  12. #include <linux/reboot.h>
  13. #include <linux/delay.h>
  14. #include <linux/blk.h>
  15. #include <linux/ide.h>
  16. #include <linux/tty.h>
  17. #include <linux/bootmem.h>
  18. #include <linux/seq_file.h>
  19. #include <asm/residual.h>
  20. #include <asm/io.h>
  21. #include <asm/prom.h>
  22. #include <asm/processor.h>
  23. #include <asm/pgtable.h>
  24. #include <asm/bootinfo.h>
  25. #include <asm/setup.h>
  26. #include <asm/amigappc.h>
  27. #include <asm/smp.h>
  28. #include <asm/elf.h>
  29. #include <asm/cputable.h>
  30. #include <asm/bootx.h>
  31. #include <asm/btext.h>
  32. #include <asm/machdep.h>
  33. #include <asm/uaccess.h>
  34. #include <asm/system.h>
  35. #include <asm/pmac_feature.h>
  36. extern void platform_init(unsigned long r3, unsigned long r4,
  37. unsigned long r5, unsigned long r6, unsigned long r7);
  38. extern void bootx_init(unsigned long r4, unsigned long phys);
  39. extern void identify_cpu(unsigned long offset, unsigned long cpu);
  40. extern void do_cpu_ftr_fixups(unsigned long offset);
  41. extern void reloc_got2(unsigned long offset);
  42. #ifdef CONFIG_XMON
  43. extern void xmon_map_scc(void);
  44. #endif
  45. extern boot_infos_t *boot_infos;
  46. char saved_command_line[512];
  47. extern char cmd_line[512];
  48. unsigned char aux_device_present;
  49. struct ide_machdep_calls ppc_ide_md;
  50. char *sysmap;
  51. unsigned long sysmap_size;
  52. /* Used with the BI_MEMSIZE bootinfo parameter to store the memory
  53.    size value reported by the boot loader. */ 
  54. unsigned long boot_mem_size;
  55. unsigned long ISA_DMA_THRESHOLD;
  56. unsigned long DMA_MODE_READ, DMA_MODE_WRITE;
  57. #ifdef CONFIG_ALL_PPC
  58. int _machine = 0;
  59. extern void prep_init(unsigned long r3, unsigned long r4,
  60. unsigned long r5, unsigned long r6, unsigned long r7);
  61. extern void pmac_init(unsigned long r3, unsigned long r4,
  62. unsigned long r5, unsigned long r6, unsigned long r7);
  63. extern void chrp_init(unsigned long r3, unsigned long r4,
  64. unsigned long r5, unsigned long r6, unsigned long r7);
  65. #endif /* CONFIG_ALL_PPC */
  66. #ifdef CONFIG_MAGIC_SYSRQ
  67. unsigned long SYSRQ_KEY;
  68. #endif /* CONFIG_MAGIC_SYSRQ */
  69. #ifdef CONFIG_VGA_CONSOLE
  70. unsigned long vgacon_remap_base;
  71. #endif
  72. struct machdep_calls ppc_md;
  73. /*
  74.  * These are used in binfmt_elf.c to put aux entries on the stack
  75.  * for each elf executable being started.
  76.  */
  77. int dcache_bsize;
  78. int icache_bsize;
  79. int ucache_bsize;
  80. #ifdef CONFIG_VGA_CONSOLE
  81. struct screen_info screen_info = {
  82. 0, 25, /* orig-x, orig-y */
  83. 0, /* unused */
  84. 0, /* orig-video-page */
  85. 0, /* orig-video-mode */
  86. 80, /* orig-video-cols */
  87. 0,0,0, /* ega_ax, ega_bx, ega_cx */
  88. 25, /* orig-video-lines */
  89. 1, /* orig-video-isVGA */
  90. 16 /* orig-video-points */
  91. };
  92. #endif /* CONFIG_VGA_CONSOLE */
  93. void machine_restart(char *cmd)
  94. {
  95. ppc_md.restart(cmd);
  96. }
  97.   
  98. void machine_power_off(void)
  99. {
  100. ppc_md.power_off();
  101. }
  102.   
  103. void machine_halt(void)
  104. {
  105. ppc_md.halt();
  106. }
  107. #ifdef CONFIG_TAU
  108. extern u32 cpu_temp(unsigned long cpu);
  109. extern u32 cpu_temp_both(unsigned long cpu);
  110. #endif /* CONFIG_TAU */
  111. int show_cpuinfo(struct seq_file *m, void *v)
  112. {
  113. int i = (int) v - 1;
  114. int err = 0;
  115. unsigned int pvr;
  116. unsigned short maj, min;
  117. unsigned long lpj;
  118. if (i >= NR_CPUS) {
  119. /* Show summary information */
  120. #ifdef CONFIG_SMP
  121. unsigned long bogosum = 0;
  122. for (i = 0; i < smp_num_cpus; ++i)
  123. if (cpu_online_map & (1 << i))
  124. bogosum += cpu_data[i].loops_per_jiffy;
  125. seq_printf(m, "total bogomipst: %lu.%02lun",
  126.    bogosum/(500000/HZ), bogosum/(5000/HZ) % 100);
  127. #endif /* CONFIG_SMP */
  128. if (ppc_md.show_cpuinfo != NULL)
  129. err = ppc_md.show_cpuinfo(m);
  130. return err;
  131. }
  132. #ifdef CONFIG_SMP
  133. if (!(cpu_online_map & (1 << i)))
  134. return 0;
  135. pvr = cpu_data[i].pvr;
  136. lpj = cpu_data[i].loops_per_jiffy;
  137. seq_printf(m, "processort: %lun", i);
  138. #else
  139. pvr = mfspr(PVR);
  140. lpj = loops_per_jiffy;
  141. #endif
  142. seq_printf(m, "cputt: ");
  143. if (cur_cpu_spec[i]->pvr_mask)
  144. seq_printf(m, "%s", cur_cpu_spec[i]->cpu_name);
  145. else
  146. seq_printf(m, "unknown (%08x)", pvr);
  147. #ifdef CONFIG_ALTIVEC
  148. if (cur_cpu_spec[i]->cpu_features & CPU_FTR_ALTIVEC)
  149. seq_printf(m, ", altivec supported");
  150. #endif
  151. seq_printf(m, "n");
  152. #ifdef CONFIG_TAU
  153. if (cur_cpu_spec[i]->cpu_features & CPU_FTR_TAU) {
  154. #ifdef CONFIG_TAU_AVERAGE
  155. /* more straightforward, but potentially misleading */
  156. seq_printf(m,  "temperature t: %u C (uncalibrated)n",
  157.    cpu_temp(i));
  158. #else
  159. /* show the actual temp sensor range */
  160. u32 temp;
  161. temp = cpu_temp_both(i);
  162. seq_printf(m, "temperature t: %u-%u C (uncalibrated)n",
  163.    temp & 0xff, temp >> 16);
  164. #endif
  165. }
  166. #endif /* CONFIG_TAU */
  167. if (ppc_md.show_percpuinfo != NULL) {
  168. err = ppc_md.show_percpuinfo(m, i);
  169. if (err)
  170. return err;
  171. }
  172. switch (PVR_VER(pvr)) {
  173. case 0x0020: /* 403 family */
  174. maj = PVR_MAJ(pvr) + 1;
  175. min = PVR_MIN(pvr);
  176. break;
  177. case 0x1008: /* 740P/750P ?? */
  178. maj = ((pvr >> 8) & 0xFF) - 1;
  179. min = pvr & 0xFF;
  180. break;
  181. default:
  182. maj = (pvr >> 8) & 0xFF;
  183. min = pvr & 0xFF;
  184. break;
  185. }
  186. seq_printf(m, "revisiont: %hd.%hd (pvr %04x %04x)n", 
  187.    maj, min, PVR_VER(pvr), PVR_REV(pvr));
  188. seq_printf(m, "bogomipst: %lu.%02lun",
  189.    lpj / (500000/HZ), (lpj / (5000/HZ)) % 100);
  190. #ifdef CONFIG_SMP
  191. seq_printf(m, "n");
  192. #endif
  193. return 0;
  194. }
  195. static void *c_start(struct seq_file *m, loff_t *pos)
  196. {
  197. int i = *pos;
  198. return i <= NR_CPUS? (void *) (i + 1): NULL;
  199. }
  200. static void *c_next(struct seq_file *m, void *v, loff_t *pos)
  201. {
  202. ++*pos;
  203. return c_start(m, pos);
  204. }
  205. static void c_stop(struct seq_file *m, void *v)
  206. {
  207. }
  208. struct seq_operations cpuinfo_op = {
  209. start: c_start,
  210. next: c_next,
  211. stop: c_stop,
  212. show: show_cpuinfo,
  213. };
  214. /*
  215.  * We're called here very early in the boot.  We determine the machine
  216.  * type and call the appropriate low-level setup functions.
  217.  *  -- Cort <cort@fsmlabs.com>
  218.  *
  219.  * Note that the kernel may be running at an address which is different
  220.  * from the address that it was linked at, so we must use RELOC/PTRRELOC
  221.  * to access static data (including strings).  -- paulus
  222.  */
  223. __init
  224. unsigned long
  225. early_init(int r3, int r4, int r5)
  226. {
  227. extern char __bss_start, _end;
  228.   unsigned long phys;
  229. unsigned long offset = reloc_offset();
  230.   /* Default */
  231.   phys = offset + KERNELBASE;
  232. /* First zero the BSS -- use memset, some arches don't have
  233.  * caches on yet */
  234. memset_io(PTRRELOC(&__bss_start), 0, &_end - &__bss_start);
  235. /*
  236.  * Identify the CPU type and fix up code sections
  237.  * that depend on which cpu we have.
  238.  */
  239. identify_cpu(offset, 0);
  240. do_cpu_ftr_fixups(offset);
  241. #if defined(CONFIG_ALL_PPC)
  242. reloc_got2(offset);
  243. /* If we came here from BootX, clear the screen,
  244.  * set up some pointers and return. */
  245. if ((r3 == 0x426f6f58) && (r5 == 0))
  246. bootx_init(r4, phys);
  247. /*
  248.  * don't do anything on prep
  249.  * for now, don't use bootinfo because it breaks yaboot 0.5
  250.  * and assume that if we didn't find a magic number, we have OF
  251.  */
  252. else if (*(unsigned long *)(0) != 0xdeadc0de)
  253. phys = prom_init(r3, r4, (prom_entry)r5);
  254. reloc_got2(-offset);
  255. #endif
  256. return phys;
  257. }
  258. #ifdef CONFIG_ALL_PPC
  259. void __init
  260. intuit_machine_type(void)
  261. {
  262. char *model;
  263. struct device_node *root;
  264. /* ask the OF info if we're a chrp or pmac */
  265. root = find_path_device("/");
  266. if (root != 0) {
  267. /* assume pmac unless proven to be chrp -- Cort */
  268. _machine = _MACH_Pmac;
  269. model = get_property(root, "device_type", NULL);
  270. if (model && !strncmp("chrp", model, 4))
  271. _machine = _MACH_chrp;
  272. else {
  273. model = get_property(root, "model", NULL);
  274. if (model && !strncmp(model, "IBM", 3))
  275. _machine = _MACH_chrp;
  276. }
  277. }
  278. }
  279. /*
  280.  * The ALL_PPC version of platform_init...
  281.  */
  282. void __init
  283. platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
  284.       unsigned long r6, unsigned long r7)
  285. {
  286. #ifdef CONFIG_BOOTX_TEXT
  287. if (boot_text_mapped) {
  288. btext_clearscreen();
  289. btext_welcome();
  290. }
  291. #endif
  292. parse_bootinfo(find_bootinfo());
  293. /* if we didn't get any bootinfo telling us what we are... */
  294. if (_machine == 0) {
  295. /* prep boot loader tells us if we're prep or not */
  296. if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) )
  297. _machine = _MACH_prep;
  298. }
  299. /* not much more to do here, if prep */
  300. if (_machine == _MACH_prep) {
  301. prep_init(r3, r4, r5, r6, r7);
  302. return;
  303. }
  304. /* prom_init has already been called from __start */
  305. if (boot_infos)
  306. relocate_nodes();
  307. /* If we aren't PReP, we can find out if we're Pmac
  308.  * or CHRP with this. */
  309. if (_machine == 0)
  310. intuit_machine_type();
  311. /* finish_device_tree may need _machine defined. */
  312. finish_device_tree();
  313. /*
  314.  * If we were booted via quik, r3 points to the physical
  315.  * address of the command-line parameters.
  316.  * If we were booted from an xcoff image (i.e. netbooted or
  317.  * booted from floppy), we get the command line from the
  318.  * bootargs property of the /chosen node.
  319.  * If an initial ramdisk is present, r3 and r4
  320.  * are used for initrd_start and initrd_size,
  321.  * otherwise they contain 0xdeadbeef.  
  322.  */
  323. if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) {
  324. cmd_line[0] = 0;
  325. strncpy(cmd_line, (char *)r3 + KERNELBASE,
  326. sizeof(cmd_line));
  327. } else if (boot_infos != 0) {
  328. /* booted by BootX - check for ramdisk */
  329. if (boot_infos->kernelParamsOffset != 0)
  330. strncpy(cmd_line, (char *) boot_infos
  331. + boot_infos->kernelParamsOffset,
  332. sizeof(cmd_line));
  333. #ifdef CONFIG_BLK_DEV_INITRD
  334. if (boot_infos->ramDisk) {
  335. initrd_start = (unsigned long) boot_infos
  336. + boot_infos->ramDisk;
  337. initrd_end = initrd_start + boot_infos->ramDiskSize;
  338. initrd_below_start_ok = 1;
  339. }
  340. #endif
  341. } else {
  342. struct device_node *chosen;
  343. char *p;
  344. #ifdef CONFIG_BLK_DEV_INITRD
  345. if (r3 && r4 && r4 != 0xdeadbeef) {
  346. if (r3 < KERNELBASE)
  347. r3 += KERNELBASE;
  348. initrd_start = r3;
  349. initrd_end = r3 + r4;
  350. ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
  351. initrd_below_start_ok = 1;
  352. }
  353. #endif
  354. chosen = find_devices("chosen");
  355. if (chosen != NULL) {
  356. p = get_property(chosen, "bootargs", NULL);
  357. if (p && *p) {
  358. cmd_line[0] = 0;
  359. strncpy(cmd_line, p, sizeof(cmd_line));
  360. }
  361. }
  362. }
  363. cmd_line[sizeof(cmd_line) - 1] = 0;
  364. switch (_machine) {
  365. case _MACH_Pmac:
  366. pmac_init(r3, r4, r5, r6, r7);
  367. break;
  368. case _MACH_chrp:
  369. chrp_init(r3, r4, r5, r6, r7);
  370. break;
  371. }
  372. }
  373. #endif /* CONFIG_ALL_PPC */
  374. #ifndef CONFIG_APUS
  375. struct bi_record *find_bootinfo(void)
  376. {
  377. struct bi_record *rec;
  378. extern char __bss_start[];
  379. rec = (struct bi_record *)_ALIGN((ulong)__bss_start+(1<<20)-1,(1<<20));
  380. if ( rec->tag != BI_FIRST ) {
  381. /*
  382.  * This 0x10000 offset is a terrible hack but it will go away when
  383.  * we have the bootloader handle all the relocation and
  384.  * prom calls -- Cort
  385.  */
  386. rec = (struct bi_record *)_ALIGN((ulong)__bss_start+0x10000+(1<<20)-1,(1<<20));
  387. if ( rec->tag != BI_FIRST )
  388. return NULL;
  389. }
  390. return rec;
  391. }
  392. void parse_bootinfo(struct bi_record *rec)
  393. {
  394. if (rec == NULL || rec->tag != BI_FIRST)
  395. return;
  396. while (rec->tag != BI_LAST) {
  397. ulong *data = rec->data;
  398. switch (rec->tag) {
  399. case BI_CMD_LINE:
  400. memcpy(cmd_line, (void *)data, rec->size - 
  401. sizeof(struct bi_record));
  402. break;
  403. case BI_SYSMAP:
  404. sysmap = (char *)((data[0] >= (KERNELBASE)) ? data[0] :
  405.   (data[0]+KERNELBASE));
  406. sysmap_size = data[1];
  407. break;
  408. #ifdef CONFIG_BLK_DEV_INITRD
  409. case BI_INITRD:
  410. initrd_start = data[0] + KERNELBASE;
  411. initrd_end = data[0] + data[1] + KERNELBASE;
  412. break;
  413. #endif /* CONFIG_BLK_DEV_INITRD */
  414. #ifdef CONFIG_ALL_PPC
  415. case BI_MACHTYPE:
  416. _machine = data[0];
  417. break;
  418. #endif /* CONFIG_ALL_PPC */
  419. case BI_MEMSIZE:
  420. boot_mem_size = data[0];
  421. break;
  422. }
  423. rec = (struct bi_record *)((ulong)rec + rec->size);
  424. }
  425. }
  426. #endif /* CONFIG_APUS */
  427. /*
  428.  * Find out what kind of machine we're on and save any data we need
  429.  * from the early boot process (devtree is copied on pmac by prom_init()).
  430.  * This is called very early on the boot process, after a minimal
  431.  * MMU environment has been set up but before MMU_init is called.
  432.  */
  433. void __init
  434. machine_init(unsigned long r3, unsigned long r4, unsigned long r5,
  435.      unsigned long r6, unsigned long r7)
  436. {
  437. #ifdef CONFIG_CMDLINE
  438. strcpy(cmd_line, CONFIG_CMDLINE);
  439. #endif /* CONFIG_CMDLINE */
  440. platform_init(r3, r4, r5, r6, r7);
  441. if (ppc_md.progress)
  442. ppc_md.progress("id mach(): done", 0x200);
  443. }
  444. /* Checks "l2cr=xxxx" command-line option */
  445. int __init ppc_setup_l2cr(char *str)
  446. {
  447. if (cur_cpu_spec[0]->cpu_features & CPU_FTR_L2CR) {
  448. unsigned long val = simple_strtoul(str, NULL, 0);
  449. printk(KERN_INFO "l2cr set to %lxn", val);
  450.                 _set_L2CR(0);           /* force invalidate by disable cache */
  451.                 _set_L2CR(val);         /* and enable it */
  452. }
  453. return 1;
  454. }
  455. __setup("l2cr=", ppc_setup_l2cr);
  456. void __init arch_discover_root(void)
  457. {
  458. if (ppc_md.discover_root != NULL)
  459. ppc_md.discover_root();
  460. }
  461. void __init ppc_init(void)
  462. {
  463. /* clear the progress line */
  464. if ( ppc_md.progress ) ppc_md.progress("             ", 0xffff);
  465. if (ppc_md.init != NULL) {
  466. ppc_md.init();
  467. }
  468. }
  469. /* Warning, IO base is not yet inited */
  470. void __init setup_arch(char **cmdline_p)
  471. {
  472. extern int panic_timeout;
  473. extern char _etext[], _edata[];
  474. extern char *klimit;
  475. extern void do_init_bootmem(void);
  476. /* so udelay does something sensible, assume <= 1000 bogomips */
  477. loops_per_jiffy = 500000000 / HZ;
  478. #ifdef CONFIG_ALL_PPC
  479. /* This could be called "early setup arch", it must be done
  480.  * now because xmon need it
  481.  */
  482. if (_machine == _MACH_Pmac)
  483. pmac_feature_init(); /* New cool way */
  484. #endif /* CONFIG_ALL_PPC */
  485. #ifdef CONFIG_XMON
  486. xmon_map_scc();
  487. if (strstr(cmd_line, "xmon"))
  488. xmon(0);
  489. #endif /* CONFIG_XMON */
  490. if ( ppc_md.progress ) ppc_md.progress("setup_arch: enter", 0x3eab);
  491. #if defined(CONFIG_KGDB)
  492. kgdb_map_scc();
  493. set_debug_traps();
  494. breakpoint();
  495. #endif
  496. /*
  497.  * Set cache line size based on type of cpu as a default.
  498.  * Systems with OF can look in the properties on the cpu node(s)
  499.  * for a possibly more accurate value.
  500.  */
  501. if (cur_cpu_spec[0]->cpu_features & CPU_FTR_SPLIT_ID_CACHE) {
  502. dcache_bsize = cur_cpu_spec[0]->dcache_bsize;
  503. icache_bsize = cur_cpu_spec[0]->icache_bsize;
  504. ucache_bsize = 0;
  505. } else
  506. ucache_bsize = dcache_bsize = icache_bsize
  507. = cur_cpu_spec[0]->dcache_bsize;
  508. /* reboot on panic */
  509. panic_timeout = 180;
  510. init_mm.start_code = PAGE_OFFSET;
  511. init_mm.end_code = (unsigned long) _etext;
  512. init_mm.end_data = (unsigned long) _edata;
  513. init_mm.brk = (unsigned long) klimit;
  514. /* Save unparsed command line copy for /proc/cmdline */
  515. strcpy(saved_command_line, cmd_line);
  516. *cmdline_p = cmd_line;
  517. /* set up the bootmem stuff with available memory */
  518. do_init_bootmem();
  519. if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
  520. ppc_md.setup_arch();
  521. if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
  522. paging_init();
  523. sort_exception_table();
  524. /* this is for modules since _machine can be a define -- Cort */
  525. ppc_md.ppc_machine = _machine;
  526. }
  527. #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) 
  528. || defined(CONFIG_USB_STORAGE) || defined(CONFIG_USB_STORAGE_MODULE)
  529. /* Convert the shorts/longs in hd_driveid from little to big endian;
  530.  * chars are endian independant, of course, but strings need to be flipped.
  531.  * (Despite what it says in drivers/block/ide.h, they come up as little
  532.  * endian...)
  533.  *
  534.  * Changes to linux/hdreg.h may require changes here. */
  535. void ppc_generic_ide_fix_driveid(struct hd_driveid *id)
  536. {
  537.         int i;
  538. unsigned short *stringcast;
  539. id->config         = __le16_to_cpu(id->config);
  540. id->cyls           = __le16_to_cpu(id->cyls);
  541. id->reserved2      = __le16_to_cpu(id->reserved2);
  542. id->heads          = __le16_to_cpu(id->heads);
  543. id->track_bytes    = __le16_to_cpu(id->track_bytes);
  544. id->sector_bytes   = __le16_to_cpu(id->sector_bytes);
  545. id->sectors        = __le16_to_cpu(id->sectors);
  546. id->vendor0        = __le16_to_cpu(id->vendor0);
  547. id->vendor1        = __le16_to_cpu(id->vendor1);
  548. id->vendor2        = __le16_to_cpu(id->vendor2);
  549. stringcast = (unsigned short *)&id->serial_no[0];
  550. for (i = 0; i < (20/2); i++)
  551.         stringcast[i] = __le16_to_cpu(stringcast[i]);
  552. id->buf_type       = __le16_to_cpu(id->buf_type);
  553. id->buf_size       = __le16_to_cpu(id->buf_size);
  554. id->ecc_bytes      = __le16_to_cpu(id->ecc_bytes);
  555. stringcast = (unsigned short *)&id->fw_rev[0];
  556. for (i = 0; i < (8/2); i++)
  557.         stringcast[i] = __le16_to_cpu(stringcast[i]);
  558. stringcast = (unsigned short *)&id->model[0];
  559. for (i = 0; i < (40/2); i++)
  560.         stringcast[i] = __le16_to_cpu(stringcast[i]);
  561. id->dword_io       = __le16_to_cpu(id->dword_io);
  562. id->reserved50     = __le16_to_cpu(id->reserved50);
  563. id->field_valid    = __le16_to_cpu(id->field_valid);
  564. id->cur_cyls       = __le16_to_cpu(id->cur_cyls);
  565. id->cur_heads      = __le16_to_cpu(id->cur_heads);
  566. id->cur_sectors    = __le16_to_cpu(id->cur_sectors);
  567. id->cur_capacity0  = __le16_to_cpu(id->cur_capacity0);
  568. id->cur_capacity1  = __le16_to_cpu(id->cur_capacity1);
  569. id->lba_capacity   = __le32_to_cpu(id->lba_capacity);
  570. id->dma_1word      = __le16_to_cpu(id->dma_1word);
  571. id->dma_mword      = __le16_to_cpu(id->dma_mword);
  572. id->eide_pio_modes = __le16_to_cpu(id->eide_pio_modes);
  573. id->eide_dma_min   = __le16_to_cpu(id->eide_dma_min);
  574. id->eide_dma_time  = __le16_to_cpu(id->eide_dma_time);
  575. id->eide_pio       = __le16_to_cpu(id->eide_pio);
  576. id->eide_pio_iordy = __le16_to_cpu(id->eide_pio_iordy);
  577. for (i = 0; i < 2; i++)
  578. id->words69_70[i] = __le16_to_cpu(id->words69_70[i]);
  579.         for (i = 0; i < 4; i++)
  580.                 id->words71_74[i] = __le16_to_cpu(id->words71_74[i]);
  581. id->queue_depth    = __le16_to_cpu(id->queue_depth);
  582. for (i = 0; i < 4; i++)
  583. id->words76_79[i] = __le16_to_cpu(id->words76_79[i]);
  584. id->major_rev_num  = __le16_to_cpu(id->major_rev_num);
  585. id->minor_rev_num  = __le16_to_cpu(id->minor_rev_num);
  586. id->command_set_1  = __le16_to_cpu(id->command_set_1);
  587. id->command_set_2  = __le16_to_cpu(id->command_set_2);
  588. id->cfsse          = __le16_to_cpu(id->cfsse);
  589. id->cfs_enable_1   = __le16_to_cpu(id->cfs_enable_1);
  590. id->cfs_enable_2   = __le16_to_cpu(id->cfs_enable_2);
  591. id->csf_default    = __le16_to_cpu(id->csf_default);
  592. id->dma_ultra      = __le16_to_cpu(id->dma_ultra);
  593. id->word89         = __le16_to_cpu(id->word89);
  594. id->word90         = __le16_to_cpu(id->word90);
  595. id->CurAPMvalues   = __le16_to_cpu(id->CurAPMvalues);
  596. id->word92         = __le16_to_cpu(id->word92);
  597. id->hw_config      = __le16_to_cpu(id->hw_config);
  598. id->acoustic       = __le16_to_cpu(id->acoustic);
  599. for (i = 0; i < 5; i++)
  600. id->words95_99[i]  = __le16_to_cpu(id->words95_99[i]);
  601. id->lba_capacity_2 = __le64_to_cpu(id->lba_capacity_2);
  602. for (i = 0; i < 22; i++)
  603. id->words104_125[i]   = __le16_to_cpu(id->words104_125[i]);
  604. id->last_lun       = __le16_to_cpu(id->last_lun);
  605. id->word127        = __le16_to_cpu(id->word127);
  606. id->dlf            = __le16_to_cpu(id->dlf);
  607. id->csfo           = __le16_to_cpu(id->csfo);
  608. for (i = 0; i < 26; i++)
  609. id->words130_155[i] = __le16_to_cpu(id->words130_155[i]);
  610. id->word156        = __le16_to_cpu(id->word156);
  611. for (i = 0; i < 3; i++)
  612. id->words157_159[i] = __le16_to_cpu(id->words157_159[i]);
  613. id->cfa_power      = __le16_to_cpu(id->cfa_power);
  614. for (i = 0; i < 14; i++)
  615. id->words161_175[i] = __le16_to_cpu(id->words161_175[i]);
  616. for (i = 0; i < 31; i++)
  617. id->words176_205[i] = __le16_to_cpu(id->words176_205[i]);
  618. for (i = 0; i < 48; i++)
  619. id->words206_254[i] = __le16_to_cpu(id->words206_254[i]);
  620. id->integrity_word  = __le16_to_cpu(id->integrity_word);
  621. }
  622. #endif